<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Doxygen: pcl::ism::ImplicitShapeModelEstimation&lt; FeatureSize, PointT, NormalT &gt; 模板类 参考</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">Doxygen
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'搜索','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','搜索');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('classpcl_1_1ism_1_1_implicit_shape_model_estimation.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="summary">
<a href="#nested-classes">类</a> &#124;
<a href="#pub-types">Public 类型</a> &#124;
<a href="#pub-methods">Public 成员函数</a> &#124;
<a href="#pro-types">Protected 类型</a> &#124;
<a href="#pro-methods">Protected 成员函数</a> &#124;
<a href="#pro-attribs">Protected 属性</a> &#124;
<a href="#pro-static-attribs">静态 Protected 属性</a> &#124;
<a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation-members.html">所有成员列表</a>  </div>
  <div class="headertitle">
<div class="title">pcl::ism::ImplicitShapeModelEstimation&lt; FeatureSize, PointT, NormalT &gt; 模板类 参考</div>  </div>
</div><!--header-->
<div class="contents">

<p>This class implements Implicit Shape Model algorithm described in "Hough Transforms and 3D SURF for robust three dimensional classication" by Jan Knopp1, Mukta Prasad, Geert Willems1, Radu Timofte, and Luc Van Gool. It has two main member functions. One for training, using the data for which we know which class it belongs to. And second for investigating a cloud for the presence of the class of interest. Implementation of the ISM algorithm described in "Hough Transforms and 3D SURF for robust three dimensional classication" by Jan Knopp, Mukta Prasad, Geert Willems, Radu Timofte, and Luc Van Gool  
 <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#details">更多...</a></p>

<p><code>#include &lt;<a class="el" href="implicit__shape__model_8h_source.html">implicit_shape_model.h</a>&gt;</code></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
类</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpcl_1_1ism_1_1_implicit_shape_model_estimation_1_1_location_info.html">LocationInfo</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">This structure stores the information about the keypoint.  <a href="structpcl_1_1ism_1_1_implicit_shape_model_estimation_1_1_location_info.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpcl_1_1ism_1_1_implicit_shape_model_estimation_1_1_t_c.html">TC</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">This structure is used for determining the end of the k-means clustering process.  <a href="structpcl_1_1ism_1_1_implicit_shape_model_estimation_1_1_t_c.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpcl_1_1ism_1_1_implicit_shape_model_estimation_1_1_visual_word_stat.html">VisualWordStat</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Structure for storing the visual word.  <a href="structpcl_1_1ism_1_1_implicit_shape_model_estimation_1_1_visual_word_stat.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-types"></a>
Public 类型</h2></td></tr>
<tr class="memitem:a17f54f427a93522738d6e32a6bef4d69"><td class="memItemLeft" align="right" valign="top"><a id="a17f54f427a93522738d6e32a6bef4d69"></a>
typedef boost::shared_ptr&lt; <a class="el" href="structpcl_1_1features_1_1_i_s_m_model.html">pcl::features::ISMModel</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><b>ISMModelPtr</b></td></tr>
<tr class="separator:a17f54f427a93522738d6e32a6bef4d69"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
Public 成员函数</h2></td></tr>
<tr class="memitem:a6dfe939775dc97b5a076c815a4d5bdac"><td class="memItemLeft" align="right" valign="top"><a id="a6dfe939775dc97b5a076c815a4d5bdac"></a>
&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a6dfe939775dc97b5a076c815a4d5bdac">ImplicitShapeModelEstimation</a> ()</td></tr>
<tr class="memdesc:a6dfe939775dc97b5a076c815a4d5bdac"><td class="mdescLeft">&#160;</td><td class="mdescRight">Simple constructor that initializes everything. <br /></td></tr>
<tr class="separator:a6dfe939775dc97b5a076c815a4d5bdac"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a54ebf011063ef77084762d3f2b08a513"><td class="memItemLeft" align="right" valign="top"><a id="a54ebf011063ef77084762d3f2b08a513"></a>
virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a54ebf011063ef77084762d3f2b08a513">~ImplicitShapeModelEstimation</a> ()</td></tr>
<tr class="memdesc:a54ebf011063ef77084762d3f2b08a513"><td class="mdescLeft">&#160;</td><td class="mdescRight">Simple destructor. <br /></td></tr>
<tr class="separator:a54ebf011063ef77084762d3f2b08a513"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2cfd927e2f6297db673dcc5b96cdc1b4"><td class="memItemLeft" align="right" valign="top"><a id="a2cfd927e2f6297db673dcc5b96cdc1b4"></a>
std::vector&lt; typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt;::Ptr &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a2cfd927e2f6297db673dcc5b96cdc1b4">getTrainingClouds</a> ()</td></tr>
<tr class="memdesc:a2cfd927e2f6297db673dcc5b96cdc1b4"><td class="mdescLeft">&#160;</td><td class="mdescRight">This method simply returns the clouds that were set as the training clouds. <br /></td></tr>
<tr class="separator:a2cfd927e2f6297db673dcc5b96cdc1b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a43e42d336b600c4d6e7d8b9665d16c86"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a43e42d336b600c4d6e7d8b9665d16c86">setTrainingClouds</a> (const std::vector&lt; typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt;::Ptr &gt; &amp;training_clouds)</td></tr>
<tr class="memdesc:a43e42d336b600c4d6e7d8b9665d16c86"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allows to set clouds for training the ISM model.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a43e42d336b600c4d6e7d8b9665d16c86">更多...</a><br /></td></tr>
<tr class="separator:a43e42d336b600c4d6e7d8b9665d16c86"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a82f839cf09e9db845af7659cb66a6fe0"><td class="memItemLeft" align="right" valign="top"><a id="a82f839cf09e9db845af7659cb66a6fe0"></a>
std::vector&lt; unsigned int &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a82f839cf09e9db845af7659cb66a6fe0">getTrainingClasses</a> ()</td></tr>
<tr class="memdesc:a82f839cf09e9db845af7659cb66a6fe0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the array of classes that indicates which class the corresponding training cloud belongs. <br /></td></tr>
<tr class="separator:a82f839cf09e9db845af7659cb66a6fe0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afa36d00337ee0a1adfc2b566fc46e9d7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#afa36d00337ee0a1adfc2b566fc46e9d7">setTrainingClasses</a> (const std::vector&lt; unsigned int &gt; &amp;training_classes)</td></tr>
<tr class="memdesc:afa36d00337ee0a1adfc2b566fc46e9d7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allows to set the class labels for the corresponding training clouds.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#afa36d00337ee0a1adfc2b566fc46e9d7">更多...</a><br /></td></tr>
<tr class="separator:afa36d00337ee0a1adfc2b566fc46e9d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af932b3a78637dc245cda7ea03d45e9e8"><td class="memItemLeft" align="right" valign="top"><a id="af932b3a78637dc245cda7ea03d45e9e8"></a>
std::vector&lt; typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::Ptr &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#af932b3a78637dc245cda7ea03d45e9e8">getTrainingNormals</a> ()</td></tr>
<tr class="memdesc:af932b3a78637dc245cda7ea03d45e9e8"><td class="mdescLeft">&#160;</td><td class="mdescRight">This method returns the coresponding cloud of normals for every training point cloud. <br /></td></tr>
<tr class="separator:af932b3a78637dc245cda7ea03d45e9e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5c310cb89a7be4b388bea1526111a525"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5c310cb89a7be4b388bea1526111a525">setTrainingNormals</a> (const std::vector&lt; typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::Ptr &gt; &amp;training_normals)</td></tr>
<tr class="memdesc:a5c310cb89a7be4b388bea1526111a525"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allows to set normals for the training clouds that were passed through setTrainingClouds method.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5c310cb89a7be4b388bea1526111a525">更多...</a><br /></td></tr>
<tr class="separator:a5c310cb89a7be4b388bea1526111a525"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afd2eea3c7f85613e9b80bf5b8f822577"><td class="memItemLeft" align="right" valign="top"><a id="afd2eea3c7f85613e9b80bf5b8f822577"></a>
float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#afd2eea3c7f85613e9b80bf5b8f822577">getSamplingSize</a> ()</td></tr>
<tr class="memdesc:afd2eea3c7f85613e9b80bf5b8f822577"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the sampling size used for cloud simplification. <br /></td></tr>
<tr class="separator:afd2eea3c7f85613e9b80bf5b8f822577"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae01b18529098566b7244f16ccf864cf1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae01b18529098566b7244f16ccf864cf1">setSamplingSize</a> (float sampling_size)</td></tr>
<tr class="memdesc:ae01b18529098566b7244f16ccf864cf1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Changes the sampling size used for cloud simplification.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae01b18529098566b7244f16ccf864cf1">更多...</a><br /></td></tr>
<tr class="separator:ae01b18529098566b7244f16ccf864cf1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aca084efb9d923b8963ae18c4b3550564"><td class="memItemLeft" align="right" valign="top"><a id="aca084efb9d923b8963ae18c4b3550564"></a>
boost::shared_ptr&lt; <a class="el" href="classpcl_1_1_feature.html">pcl::Feature</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_histogram.html">pcl::Histogram</a>&lt; FeatureSize &gt; &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aca084efb9d923b8963ae18c4b3550564">getFeatureEstimator</a> ()</td></tr>
<tr class="memdesc:aca084efb9d923b8963ae18c4b3550564"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the current feature estimator used for extraction of the descriptors. <br /></td></tr>
<tr class="separator:aca084efb9d923b8963ae18c4b3550564"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aaf734e2f3120bb043404596956f01f6c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aaf734e2f3120bb043404596956f01f6c">setFeatureEstimator</a> (boost::shared_ptr&lt; <a class="el" href="classpcl_1_1_feature.html">pcl::Feature</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_histogram.html">pcl::Histogram</a>&lt; FeatureSize &gt; &gt; &gt; feature)</td></tr>
<tr class="memdesc:aaf734e2f3120bb043404596956f01f6c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Changes the feature estimator.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aaf734e2f3120bb043404596956f01f6c">更多...</a><br /></td></tr>
<tr class="separator:aaf734e2f3120bb043404596956f01f6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab4cf537c4ecdbd38cdaa92bbefd2654d"><td class="memItemLeft" align="right" valign="top"><a id="ab4cf537c4ecdbd38cdaa92bbefd2654d"></a>
unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab4cf537c4ecdbd38cdaa92bbefd2654d">getNumberOfClusters</a> ()</td></tr>
<tr class="memdesc:ab4cf537c4ecdbd38cdaa92bbefd2654d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the number of clusters used for descriptor clustering. <br /></td></tr>
<tr class="separator:ab4cf537c4ecdbd38cdaa92bbefd2654d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac0b8072d7f6048c714854202bf00790a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ac0b8072d7f6048c714854202bf00790a">setNumberOfClusters</a> (unsigned int num_of_clusters)</td></tr>
<tr class="memdesc:ac0b8072d7f6048c714854202bf00790a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Changes the number of clusters.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ac0b8072d7f6048c714854202bf00790a">更多...</a><br /></td></tr>
<tr class="separator:ac0b8072d7f6048c714854202bf00790a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:acddaa58ec2977624f87a24e5432d831e"><td class="memItemLeft" align="right" valign="top"><a id="acddaa58ec2977624f87a24e5432d831e"></a>
std::vector&lt; float &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#acddaa58ec2977624f87a24e5432d831e">getSigmaDists</a> ()</td></tr>
<tr class="memdesc:acddaa58ec2977624f87a24e5432d831e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the array of sigma values. <br /></td></tr>
<tr class="separator:acddaa58ec2977624f87a24e5432d831e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af8eb194807519f620f01decec6dcd8a7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#af8eb194807519f620f01decec6dcd8a7">setSigmaDists</a> (const std::vector&lt; float &gt; &amp;training_sigmas)</td></tr>
<tr class="memdesc:af8eb194807519f620f01decec6dcd8a7"><td class="mdescLeft">&#160;</td><td class="mdescRight">This method allows to set the value of sigma used for calculating the learned weights for every single class.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#af8eb194807519f620f01decec6dcd8a7">更多...</a><br /></td></tr>
<tr class="separator:af8eb194807519f620f01decec6dcd8a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5b8561475b8dcf05c214fdaa3d786918"><td class="memItemLeft" align="right" valign="top"><a id="a5b8561475b8dcf05c214fdaa3d786918"></a>
bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5b8561475b8dcf05c214fdaa3d786918">getNVotState</a> ()</td></tr>
<tr class="memdesc:a5b8561475b8dcf05c214fdaa3d786918"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the state of Nvot coeff from [Knopp et al., 2010, (4)], if set to false then coeff is taken as 1.0. It is just a kind of heuristic. The default behavior is as in the article. So you can ignore this if you want. <br /></td></tr>
<tr class="separator:a5b8561475b8dcf05c214fdaa3d786918"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4a5c99e74ddf4ae9bc3caa3575b6ca11"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a4a5c99e74ddf4ae9bc3caa3575b6ca11">setNVotState</a> (bool state)</td></tr>
<tr class="memdesc:a4a5c99e74ddf4ae9bc3caa3575b6ca11"><td class="mdescLeft">&#160;</td><td class="mdescRight">Changes the state of the Nvot coeff from [Knopp et al., 2010, (4)].  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a4a5c99e74ddf4ae9bc3caa3575b6ca11">更多...</a><br /></td></tr>
<tr class="separator:a4a5c99e74ddf4ae9bc3caa3575b6ca11"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0df7cc562e4e36d408c2738e67d1191f"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a0df7cc562e4e36d408c2738e67d1191f">trainISM</a> (ISMModelPtr &amp;trained_model)</td></tr>
<tr class="memdesc:a0df7cc562e4e36d408c2738e67d1191f"><td class="mdescLeft">&#160;</td><td class="mdescRight">This method performs training and forms a visual vocabulary. It returns a trained model that can be saved to file for later usage.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a0df7cc562e4e36d408c2738e67d1191f">更多...</a><br /></td></tr>
<tr class="separator:a0df7cc562e4e36d408c2738e67d1191f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a16e7d9f66e627dc6e68206ffabb45c95"><td class="memItemLeft" align="right" valign="top">boost::shared_ptr&lt; <a class="el" href="classpcl_1_1features_1_1_i_s_m_vote_list.html">pcl::features::ISMVoteList</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a16e7d9f66e627dc6e68206ffabb45c95">findObjects</a> (ISMModelPtr model, typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt;::Ptr in_cloud, typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_normal.html">Normal</a> &gt;::Ptr in_normals, int in_class_of_interest)</td></tr>
<tr class="memdesc:a16e7d9f66e627dc6e68206ffabb45c95"><td class="mdescLeft">&#160;</td><td class="mdescRight">This function is searching for the class of interest in a given cloud and returns the list of votes.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a16e7d9f66e627dc6e68206ffabb45c95">更多...</a><br /></td></tr>
<tr class="separator:a16e7d9f66e627dc6e68206ffabb45c95"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-types"></a>
Protected 类型</h2></td></tr>
<tr class="memitem:a2110e36af289f3b172a1aecff09e300c"><td class="memItemLeft" align="right" valign="top"><a id="a2110e36af289f3b172a1aecff09e300c"></a>
typedef struct PCL_EXPORTS <a class="el" href="structpcl_1_1ism_1_1_implicit_shape_model_estimation_1_1_t_c.html">pcl::ism::ImplicitShapeModelEstimation::TC</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a2110e36af289f3b172a1aecff09e300c">TermCriteria</a></td></tr>
<tr class="memdesc:a2110e36af289f3b172a1aecff09e300c"><td class="mdescLeft">&#160;</td><td class="mdescRight">This structure is used for determining the end of the k-means clustering process. <br /></td></tr>
<tr class="separator:a2110e36af289f3b172a1aecff09e300c"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
Protected 成员函数</h2></td></tr>
<tr class="memitem:aada2c42e9685032c4cd2beb2a29b157c"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aada2c42e9685032c4cd2beb2a29b157c">extractDescriptors</a> (std::vector&lt; <a class="el" href="structpcl_1_1_histogram.html">pcl::Histogram</a>&lt; FeatureSize &gt; &gt; &amp;histograms, std::vector&lt; <a class="el" href="structpcl_1_1ism_1_1_implicit_shape_model_estimation_1_1_location_info.html">LocationInfo</a>, Eigen::aligned_allocator&lt; <a class="el" href="structpcl_1_1ism_1_1_implicit_shape_model_estimation_1_1_location_info.html">LocationInfo</a> &gt; &gt; &amp;locations)</td></tr>
<tr class="memdesc:aada2c42e9685032c4cd2beb2a29b157c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extracts the descriptors from the input clouds.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aada2c42e9685032c4cd2beb2a29b157c">更多...</a><br /></td></tr>
<tr class="separator:aada2c42e9685032c4cd2beb2a29b157c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:accdd4bb97e49ade2295cd49f59e78eba"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#accdd4bb97e49ade2295cd49f59e78eba">clusterDescriptors</a> (std::vector&lt; <a class="el" href="structpcl_1_1_histogram.html">pcl::Histogram</a>&lt; FeatureSize &gt; &gt; &amp;histograms, Eigen::MatrixXi &amp;labels, Eigen::MatrixXf &amp;clusters_centers)</td></tr>
<tr class="memdesc:accdd4bb97e49ade2295cd49f59e78eba"><td class="mdescLeft">&#160;</td><td class="mdescRight">This method performs descriptor clustering.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#accdd4bb97e49ade2295cd49f59e78eba">更多...</a><br /></td></tr>
<tr class="separator:accdd4bb97e49ade2295cd49f59e78eba"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab5390e2ac51390339be681e644a1bdc9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab5390e2ac51390339be681e644a1bdc9">calculateSigmas</a> (std::vector&lt; float &gt; &amp;sigmas)</td></tr>
<tr class="memdesc:ab5390e2ac51390339be681e644a1bdc9"><td class="mdescLeft">&#160;</td><td class="mdescRight">This method calculates the value of sigma used for calculating the learned weights for every single class.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab5390e2ac51390339be681e644a1bdc9">更多...</a><br /></td></tr>
<tr class="separator:ab5390e2ac51390339be681e644a1bdc9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a833845333ec925a77af5b963953ee37d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a833845333ec925a77af5b963953ee37d">calculateWeights</a> (const std::vector&lt; <a class="el" href="structpcl_1_1ism_1_1_implicit_shape_model_estimation_1_1_location_info.html">LocationInfo</a>, Eigen::aligned_allocator&lt; <a class="el" href="structpcl_1_1ism_1_1_implicit_shape_model_estimation_1_1_location_info.html">LocationInfo</a> &gt; &gt; &amp;locations, const Eigen::MatrixXi &amp;labels, std::vector&lt; float &gt; &amp;sigmas, std::vector&lt; std::vector&lt; unsigned int &gt; &gt; &amp;clusters, std::vector&lt; std::vector&lt; float &gt; &gt; &amp;statistical_weights, std::vector&lt; float &gt; &amp;learned_weights)</td></tr>
<tr class="memdesc:a833845333ec925a77af5b963953ee37d"><td class="mdescLeft">&#160;</td><td class="mdescRight">This function forms a visual vocabulary and evaluates weights described in [Knopp et al., 2010, (5)].  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a833845333ec925a77af5b963953ee37d">更多...</a><br /></td></tr>
<tr class="separator:a833845333ec925a77af5b963953ee37d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aeab8318ded750cbf52cd272daeeeba98"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aeab8318ded750cbf52cd272daeeeba98">simplifyCloud</a> (typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt;::ConstPtr in_point_cloud, typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::ConstPtr in_normal_cloud, typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt;::Ptr out_sampled_point_cloud, typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::Ptr out_sampled_normal_cloud)</td></tr>
<tr class="memdesc:aeab8318ded750cbf52cd272daeeeba98"><td class="mdescLeft">&#160;</td><td class="mdescRight">Simplifies the cloud using voxel grid principles.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aeab8318ded750cbf52cd272daeeeba98">更多...</a><br /></td></tr>
<tr class="separator:aeab8318ded750cbf52cd272daeeeba98"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a56c5bfb3d5801c417ae72bd8f2f80316"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a56c5bfb3d5801c417ae72bd8f2f80316">shiftCloud</a> (typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt;::Ptr in_cloud, Eigen::Vector3f shift_point)</td></tr>
<tr class="memdesc:a56c5bfb3d5801c417ae72bd8f2f80316"><td class="mdescLeft">&#160;</td><td class="mdescRight">This method simply shifts the clouds points relative to the passed point.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a56c5bfb3d5801c417ae72bd8f2f80316">更多...</a><br /></td></tr>
<tr class="separator:a56c5bfb3d5801c417ae72bd8f2f80316"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1d9b74d62021c431e5519a0546b888c5"><td class="memItemLeft" align="right" valign="top">Eigen::Matrix3f&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a1d9b74d62021c431e5519a0546b888c5">alignYCoordWithNormal</a> (const <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &amp;in_normal)</td></tr>
<tr class="memdesc:a1d9b74d62021c431e5519a0546b888c5"><td class="mdescLeft">&#160;</td><td class="mdescRight">This method simply computes the rotation matrix, so that the given normal would match the Y axis after the transformation. This is done because the algorithm needs to be invariant to the affine transformations.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a1d9b74d62021c431e5519a0546b888c5">更多...</a><br /></td></tr>
<tr class="separator:a1d9b74d62021c431e5519a0546b888c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1ba2c5aed4e6ca83a4c43e51c0f8b915"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a1ba2c5aed4e6ca83a4c43e51c0f8b915">applyTransform</a> (Eigen::Vector3f &amp;io_vec, const Eigen::Matrix3f &amp;in_transform)</td></tr>
<tr class="memdesc:a1ba2c5aed4e6ca83a4c43e51c0f8b915"><td class="mdescLeft">&#160;</td><td class="mdescRight">This method applies transform set in in_transform to vector io_vector.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a1ba2c5aed4e6ca83a4c43e51c0f8b915">更多...</a><br /></td></tr>
<tr class="separator:a1ba2c5aed4e6ca83a4c43e51c0f8b915"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a95ecb201992f3fcc3b0df7f30d1db105"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a95ecb201992f3fcc3b0df7f30d1db105">estimateFeatures</a> (typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt;::Ptr sampled_point_cloud, typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::Ptr normal_cloud, typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_histogram.html">pcl::Histogram</a>&lt; FeatureSize &gt; &gt;::Ptr feature_cloud)</td></tr>
<tr class="memdesc:a95ecb201992f3fcc3b0df7f30d1db105"><td class="mdescLeft">&#160;</td><td class="mdescRight">This method estimates features for the given point cloud.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a95ecb201992f3fcc3b0df7f30d1db105">更多...</a><br /></td></tr>
<tr class="separator:a95ecb201992f3fcc3b0df7f30d1db105"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6e7cc25fdb5957ffb10cc45cffdfc144"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a6e7cc25fdb5957ffb10cc45cffdfc144">computeKMeansClustering</a> (const Eigen::MatrixXf &amp;points_to_cluster, int number_of_clusters, Eigen::MatrixXi &amp;io_labels, <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a2110e36af289f3b172a1aecff09e300c">TermCriteria</a> criteria, int attempts, int flags, Eigen::MatrixXf &amp;cluster_centers)</td></tr>
<tr class="memdesc:a6e7cc25fdb5957ffb10cc45cffdfc144"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs K-means clustering.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a6e7cc25fdb5957ffb10cc45cffdfc144">更多...</a><br /></td></tr>
<tr class="separator:a6e7cc25fdb5957ffb10cc45cffdfc144"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6a0f8e46d933e4b93b320a2c9682db84"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a6a0f8e46d933e4b93b320a2c9682db84">generateCentersPP</a> (const Eigen::MatrixXf &amp;data, Eigen::MatrixXf &amp;out_centers, int number_of_clusters, int trials)</td></tr>
<tr class="memdesc:a6a0f8e46d933e4b93b320a2c9682db84"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generates centers for clusters as described in Arthur, David and Sergei Vassilvitski (2007) k-means++: The Advantages of Careful Seeding.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a6a0f8e46d933e4b93b320a2c9682db84">更多...</a><br /></td></tr>
<tr class="separator:a6a0f8e46d933e4b93b320a2c9682db84"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a33688b88157c6d8b15290ed88646effb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a33688b88157c6d8b15290ed88646effb">generateRandomCenter</a> (const std::vector&lt; Eigen::Vector2f, Eigen::aligned_allocator&lt; Eigen::Vector2f &gt; &gt; &amp;boxes, Eigen::VectorXf &amp;center)</td></tr>
<tr class="memdesc:a33688b88157c6d8b15290ed88646effb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generates random center for cluster.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a33688b88157c6d8b15290ed88646effb">更多...</a><br /></td></tr>
<tr class="separator:a33688b88157c6d8b15290ed88646effb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4f7f33ad9a8cec7886f8746b45165095"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a4f7f33ad9a8cec7886f8746b45165095">computeDistance</a> (Eigen::VectorXf &amp;vec_1, Eigen::VectorXf &amp;vec_2)</td></tr>
<tr class="memdesc:a4f7f33ad9a8cec7886f8746b45165095"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes the square distance beetween two vectors.  <a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a4f7f33ad9a8cec7886f8746b45165095">更多...</a><br /></td></tr>
<tr class="separator:a4f7f33ad9a8cec7886f8746b45165095"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a28998d39a77ee1428add8d117ffa73eb"><td class="memItemLeft" align="right" valign="top"><a id="a28998d39a77ee1428add8d117ffa73eb"></a>
<a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">ImplicitShapeModelEstimation</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a28998d39a77ee1428add8d117ffa73eb">operator=</a> (const <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">ImplicitShapeModelEstimation</a> &amp;)</td></tr>
<tr class="memdesc:a28998d39a77ee1428add8d117ffa73eb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Forbids the assignment operator. <br /></td></tr>
<tr class="separator:a28998d39a77ee1428add8d117ffa73eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-attribs"></a>
Protected 属性</h2></td></tr>
<tr class="memitem:ae649a1601f3d60f929d41782e9733bea"><td class="memItemLeft" align="right" valign="top"><a id="ae649a1601f3d60f929d41782e9733bea"></a>
std::vector&lt; typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt;::Ptr &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a></td></tr>
<tr class="memdesc:ae649a1601f3d60f929d41782e9733bea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Stores the clouds used for training. <br /></td></tr>
<tr class="separator:ae649a1601f3d60f929d41782e9733bea"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5bea2020d8fbe1a7a824eb57eed5a31e"><td class="memItemLeft" align="right" valign="top"><a id="a5bea2020d8fbe1a7a824eb57eed5a31e"></a>
std::vector&lt; unsigned int &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a></td></tr>
<tr class="memdesc:a5bea2020d8fbe1a7a824eb57eed5a31e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Stores the class number for each cloud from training_clouds_. <br /></td></tr>
<tr class="separator:a5bea2020d8fbe1a7a824eb57eed5a31e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7145a95483ee85c15fb36bf0c34a4861"><td class="memItemLeft" align="right" valign="top"><a id="a7145a95483ee85c15fb36bf0c34a4861"></a>
std::vector&lt; typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::Ptr &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a7145a95483ee85c15fb36bf0c34a4861">training_normals_</a></td></tr>
<tr class="memdesc:a7145a95483ee85c15fb36bf0c34a4861"><td class="mdescLeft">&#160;</td><td class="mdescRight">Stores the normals for each training cloud. <br /></td></tr>
<tr class="separator:a7145a95483ee85c15fb36bf0c34a4861"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae02a68f40df9efa2b38bb4acc6b58f20"><td class="memItemLeft" align="right" valign="top"><a id="ae02a68f40df9efa2b38bb4acc6b58f20"></a>
std::vector&lt; float &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae02a68f40df9efa2b38bb4acc6b58f20">training_sigmas_</a></td></tr>
<tr class="memdesc:ae02a68f40df9efa2b38bb4acc6b58f20"><td class="mdescLeft">&#160;</td><td class="mdescRight">This array stores the sigma values for each training class. If this array has a size equals 0, then sigma values will be calculated automatically. <br /></td></tr>
<tr class="separator:ae02a68f40df9efa2b38bb4acc6b58f20"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:adf847cb3c880ca5d2dc5f71d60a0d725"><td class="memItemLeft" align="right" valign="top"><a id="adf847cb3c880ca5d2dc5f71d60a0d725"></a>
float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#adf847cb3c880ca5d2dc5f71d60a0d725">sampling_size_</a></td></tr>
<tr class="memdesc:adf847cb3c880ca5d2dc5f71d60a0d725"><td class="mdescLeft">&#160;</td><td class="mdescRight">This value is used for the simplification. It sets the size of grid bin. <br /></td></tr>
<tr class="separator:adf847cb3c880ca5d2dc5f71d60a0d725"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a59c6f181873500f38df1d7eab07a67cb"><td class="memItemLeft" align="right" valign="top"><a id="a59c6f181873500f38df1d7eab07a67cb"></a>
boost::shared_ptr&lt; <a class="el" href="classpcl_1_1_feature.html">pcl::Feature</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_histogram.html">pcl::Histogram</a>&lt; FeatureSize &gt; &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a59c6f181873500f38df1d7eab07a67cb">feature_estimator_</a></td></tr>
<tr class="memdesc:a59c6f181873500f38df1d7eab07a67cb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Stores the feature estimator. <br /></td></tr>
<tr class="separator:a59c6f181873500f38df1d7eab07a67cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab74fef9c7fed6a762448dd89f9210e12"><td class="memItemLeft" align="right" valign="top"><a id="ab74fef9c7fed6a762448dd89f9210e12"></a>
unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab74fef9c7fed6a762448dd89f9210e12">number_of_clusters_</a></td></tr>
<tr class="memdesc:ab74fef9c7fed6a762448dd89f9210e12"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of clusters, is used for clustering descriptors during the training. <br /></td></tr>
<tr class="separator:ab74fef9c7fed6a762448dd89f9210e12"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aaf6529639183fac2a343afad1329c389"><td class="memItemLeft" align="right" valign="top"><a id="aaf6529639183fac2a343afad1329c389"></a>
bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aaf6529639183fac2a343afad1329c389">n_vot_ON_</a></td></tr>
<tr class="memdesc:aaf6529639183fac2a343afad1329c389"><td class="mdescLeft">&#160;</td><td class="mdescRight">If set to false then Nvot coeff from [Knopp et al., 2010, (4)] is equal 1.0. <br /></td></tr>
<tr class="separator:aaf6529639183fac2a343afad1329c389"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-static-attribs"></a>
静态 Protected 属性</h2></td></tr>
<tr class="memitem:a95927f44e0c0364766cd4fc0ceace646"><td class="memItemLeft" align="right" valign="top"><a id="a95927f44e0c0364766cd4fc0ceace646"></a>
static const int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a95927f44e0c0364766cd4fc0ceace646">PP_CENTERS</a> = 2</td></tr>
<tr class="memdesc:a95927f44e0c0364766cd4fc0ceace646"><td class="mdescLeft">&#160;</td><td class="mdescRight">This const value is used for indicating that for k-means clustering centers must be generated as described in Arthur, David and Sergei Vassilvitski (2007) k-means++: The Advantages of Careful Seeding. <br /></td></tr>
<tr class="separator:a95927f44e0c0364766cd4fc0ceace646"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad32395d4f6b46da4433911b29045b5b5"><td class="memItemLeft" align="right" valign="top"><a id="ad32395d4f6b46da4433911b29045b5b5"></a>
static const int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ad32395d4f6b46da4433911b29045b5b5">USE_INITIAL_LABELS</a> = 1</td></tr>
<tr class="memdesc:ad32395d4f6b46da4433911b29045b5b5"><td class="mdescLeft">&#160;</td><td class="mdescRight">This const value is used for indicating that input labels must be taken as the initial approximation for k-means clustering. <br /></td></tr>
<tr class="separator:ad32395d4f6b46da4433911b29045b5b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">详细描述</h2>
<div class="textblock"><h3>template&lt;int FeatureSize, typename PointT, typename NormalT = pcl::Normal&gt;<br />
class pcl::ism::ImplicitShapeModelEstimation&lt; FeatureSize, PointT, NormalT &gt;</h3>

<p>This class implements Implicit Shape Model algorithm described in "Hough Transforms and 3D SURF for robust three dimensional classication" by Jan Knopp1, Mukta Prasad, Geert Willems1, Radu Timofte, and Luc Van Gool. It has two main member functions. One for training, using the data for which we know which class it belongs to. And second for investigating a cloud for the presence of the class of interest. Implementation of the ISM algorithm described in "Hough Transforms and 3D SURF for robust three dimensional classication" by Jan Knopp, Mukta Prasad, Geert Willems, Radu Timofte, and Luc Van Gool </p>
<p>Authors: Roman Shapovalov, Alexander Velizhev, Sergey Ushakov </p>
</div><h2 class="groupheader">成员函数说明</h2>
<a id="a1d9b74d62021c431e5519a0546b888c5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1d9b74d62021c431e5519a0546b888c5">&#9670;&nbsp;</a></span>alignYCoordWithNormal()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">Eigen::Matrix3f <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::alignYCoordWithNormal </td>
          <td>(</td>
          <td class="paramtype">const <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &amp;&#160;</td>
          <td class="paramname"><em>in_normal</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">protected</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>This method simply computes the rotation matrix, so that the given normal would match the Y axis after the transformation. This is done because the algorithm needs to be invariant to the affine transformations. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">in_normal</td><td>normal for which the rotation matrix need to be computed </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;{</div>
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160;  Eigen::Matrix3f result;</div>
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;  Eigen::Matrix3f rotation_matrix_X;</div>
<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160;  Eigen::Matrix3f rotation_matrix_Z;</div>
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160; </div>
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;  <span class="keywordtype">float</span> A = 0.0f;</div>
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;  <span class="keywordtype">float</span> B = 0.0f;</div>
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;  <span class="keywordtype">float</span> sign = -1.0f;</div>
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160; </div>
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160;  <span class="keywordtype">float</span> denom_X = <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (sqrt (in_normal.normal_z * in_normal.normal_z + in_normal.normal_y * in_normal.normal_y));</div>
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160;  A = in_normal.normal_y / denom_X;</div>
<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;  B = sign * in_normal.normal_z / denom_X;</div>
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;  rotation_matrix_X &lt;&lt; 1.0f,   0.0f,   0.0f,</div>
<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;                       0.0f,      A,     -B,</div>
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;                       0.0f,      B,      A;</div>
<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160; </div>
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;  <span class="keywordtype">float</span> denom_Z = <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (sqrt (in_normal.normal_x * in_normal.normal_x + in_normal.normal_y * in_normal.normal_y));</div>
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160;  A = in_normal.normal_y / denom_Z;</div>
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;  B = sign * in_normal.normal_x / denom_Z;</div>
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;  rotation_matrix_Z &lt;&lt;    A,     -B,   0.0f,</div>
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160;                          B,      A,   0.0f,</div>
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160;                       0.0f,   0.0f,   1.0f;</div>
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160; </div>
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160;  result = rotation_matrix_X * rotation_matrix_Z;</div>
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160; </div>
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160;  <span class="keywordflow">return</span> (result);</div>
<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160;}</div>
</div><!-- fragment -->
</div>
</div>
<a id="a1ba2c5aed4e6ca83a4c43e51c0f8b915"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1ba2c5aed4e6ca83a4c43e51c0f8b915">&#9670;&nbsp;</a></span>applyTransform()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::applyTransform </td>
          <td>(</td>
          <td class="paramtype">Eigen::Vector3f &amp;&#160;</td>
          <td class="paramname"><em>io_vec</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const Eigen::Matrix3f &amp;&#160;</td>
          <td class="paramname"><em>in_transform</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">protected</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>This method applies transform set in in_transform to vector io_vector. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">io_vec</td><td>vector that need to be transformed </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">in_transform</td><td>matrix that contains the transformation </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160;{</div>
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160;  io_vec = in_transform * io_vec;</div>
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;}</div>
</div><!-- fragment -->
</div>
</div>
<a id="ab5390e2ac51390339be681e644a1bdc9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab5390e2ac51390339be681e644a1bdc9">&#9670;&nbsp;</a></span>calculateSigmas()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::calculateSigmas </td>
          <td>(</td>
          <td class="paramtype">std::vector&lt; float &gt; &amp;&#160;</td>
          <td class="paramname"><em>sigmas</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">protected</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>This method calculates the value of sigma used for calculating the learned weights for every single class. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[out]</td><td class="paramname">sigmas</td><td>computed sigmas. </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;{</div>
<div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae02a68f40df9efa2b38bb4acc6b58f20">training_sigmas_</a>.size () != 0)</div>
<div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;  {</div>
<div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;    sigmas.resize (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae02a68f40df9efa2b38bb4acc6b58f20">training_sigmas_</a>.size (), 0.0f);</div>
<div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_sigma = 0; i_sigma &lt; <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae02a68f40df9efa2b38bb4acc6b58f20">training_sigmas_</a>.size (); i_sigma++)</div>
<div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;      sigmas[i_sigma] = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae02a68f40df9efa2b38bb4acc6b58f20">training_sigmas_</a>[i_sigma];</div>
<div class="line"><a name="l00949"></a><span class="lineno">  949</span>&#160;    <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00950"></a><span class="lineno">  950</span>&#160;  }</div>
<div class="line"><a name="l00951"></a><span class="lineno">  951</span>&#160; </div>
<div class="line"><a name="l00952"></a><span class="lineno">  952</span>&#160;  sigmas.clear ();</div>
<div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> number_of_classes = *std::max_element (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>.begin (), <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>.end () ) + 1;</div>
<div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;  sigmas.resize (number_of_classes, 0.0f);</div>
<div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160; </div>
<div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;  std::vector&lt;float&gt; vec;</div>
<div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;  std::vector&lt;std::vector&lt;float&gt; &gt; objects_sigmas;</div>
<div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;  objects_sigmas.resize (number_of_classes, vec);</div>
<div class="line"><a name="l00959"></a><span class="lineno">  959</span>&#160; </div>
<div class="line"><a name="l00960"></a><span class="lineno">  960</span>&#160;  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> number_of_objects = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span> (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>.size ());</div>
<div class="line"><a name="l00961"></a><span class="lineno">  961</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_object = 0; i_object &lt; number_of_objects; i_object++)</div>
<div class="line"><a name="l00962"></a><span class="lineno">  962</span>&#160;  {</div>
<div class="line"><a name="l00963"></a><span class="lineno">  963</span>&#160;    <span class="keywordtype">float</span> max_distance = 0.0f;</div>
<div class="line"><a name="l00964"></a><span class="lineno">  964</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> number_of_points = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span> (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>[i_object]-&gt;points.size ());</div>
<div class="line"><a name="l00965"></a><span class="lineno">  965</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_point = 0; i_point &lt; number_of_points - 1; i_point++)</div>
<div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;      <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j_point = i_point + 1; j_point &lt; number_of_points; j_point++)</div>
<div class="line"><a name="l00967"></a><span class="lineno">  967</span>&#160;      {</div>
<div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;        <span class="keywordtype">float</span> curr_distance = 0.0f;</div>
<div class="line"><a name="l00969"></a><span class="lineno">  969</span>&#160;        curr_distance += <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>[i_object]-&gt;points[i_point].x * <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>[i_object]-&gt;points[j_point].x;</div>
<div class="line"><a name="l00970"></a><span class="lineno">  970</span>&#160;        curr_distance += <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>[i_object]-&gt;points[i_point].y * <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>[i_object]-&gt;points[j_point].y;</div>
<div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;        curr_distance += <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>[i_object]-&gt;points[i_point].z * <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>[i_object]-&gt;points[j_point].z;</div>
<div class="line"><a name="l00972"></a><span class="lineno">  972</span>&#160;        <span class="keywordflow">if</span> (curr_distance &gt; max_distance)</div>
<div class="line"><a name="l00973"></a><span class="lineno">  973</span>&#160;          max_distance = curr_distance;</div>
<div class="line"><a name="l00974"></a><span class="lineno">  974</span>&#160;      }</div>
<div class="line"><a name="l00975"></a><span class="lineno">  975</span>&#160;    max_distance = <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (sqrt (max_distance));</div>
<div class="line"><a name="l00976"></a><span class="lineno">  976</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_class = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>[i_object];</div>
<div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160;    objects_sigmas[i_class].push_back (max_distance);</div>
<div class="line"><a name="l00978"></a><span class="lineno">  978</span>&#160;  }</div>
<div class="line"><a name="l00979"></a><span class="lineno">  979</span>&#160; </div>
<div class="line"><a name="l00980"></a><span class="lineno">  980</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_class = 0; i_class &lt; number_of_classes; i_class++)</div>
<div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;  {</div>
<div class="line"><a name="l00982"></a><span class="lineno">  982</span>&#160;    <span class="keywordtype">float</span> sig = 0.0f;</div>
<div class="line"><a name="l00983"></a><span class="lineno">  983</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> number_of_objects_in_class = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span> (objects_sigmas[i_class].size ());</div>
<div class="line"><a name="l00984"></a><span class="lineno">  984</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_object = 0; i_object &lt; number_of_objects_in_class; i_object++)</div>
<div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;      sig += objects_sigmas[i_class][i_object];</div>
<div class="line"><a name="l00986"></a><span class="lineno">  986</span>&#160;    sig /= (<span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (number_of_objects_in_class) * 10.0f);</div>
<div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;    sigmas[i_class] = sig;</div>
<div class="line"><a name="l00988"></a><span class="lineno">  988</span>&#160;  }</div>
<div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;}</div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_a5bea2020d8fbe1a7a824eb57eed5a31e"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">pcl::ism::ImplicitShapeModelEstimation::training_classes_</a></div><div class="ttdeci">std::vector&lt; unsigned int &gt; training_classes_</div><div class="ttdoc">Stores the class number for each cloud from training_clouds_.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.h:587</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_ae02a68f40df9efa2b38bb4acc6b58f20"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae02a68f40df9efa2b38bb4acc6b58f20">pcl::ism::ImplicitShapeModelEstimation::training_sigmas_</a></div><div class="ttdeci">std::vector&lt; float &gt; training_sigmas_</div><div class="ttdoc">This array stores the sigma values for each training class. If this array has a size equals 0,...</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.h:595</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_ae649a1601f3d60f929d41782e9733bea"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">pcl::ism::ImplicitShapeModelEstimation::training_clouds_</a></div><div class="ttdeci">std::vector&lt; typename pcl::PointCloud&lt; PointT &gt;::Ptr &gt; training_clouds_</div><div class="ttdoc">Stores the clouds used for training.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.h:584</div></div>
</div><!-- fragment -->
</div>
</div>
<a id="a833845333ec925a77af5b963953ee37d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a833845333ec925a77af5b963953ee37d">&#9670;&nbsp;</a></span>calculateWeights()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::calculateWeights </td>
          <td>(</td>
          <td class="paramtype">const std::vector&lt; <a class="el" href="structpcl_1_1ism_1_1_implicit_shape_model_estimation_1_1_location_info.html">LocationInfo</a>, Eigen::aligned_allocator&lt; <a class="el" href="structpcl_1_1ism_1_1_implicit_shape_model_estimation_1_1_location_info.html">LocationInfo</a> &gt; &gt; &amp;&#160;</td>
          <td class="paramname"><em>locations</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const Eigen::MatrixXi &amp;&#160;</td>
          <td class="paramname"><em>labels</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">std::vector&lt; float &gt; &amp;&#160;</td>
          <td class="paramname"><em>sigmas</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">std::vector&lt; std::vector&lt; unsigned int &gt; &gt; &amp;&#160;</td>
          <td class="paramname"><em>clusters</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">std::vector&lt; std::vector&lt; float &gt; &gt; &amp;&#160;</td>
          <td class="paramname"><em>statistical_weights</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">std::vector&lt; float &gt; &amp;&#160;</td>
          <td class="paramname"><em>learned_weights</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">protected</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>This function forms a visual vocabulary and evaluates weights described in [Knopp et al., 2010, (5)]. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">locations</td><td>array containing description of each keypoint: its position, which cloud belongs and expected direction to center </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">labels</td><td>labels that were obtained during k-means clustering </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">sigmas</td><td>array of sigmas for each class </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">clusters</td><td>clusters that were obtained during k-means clustering </td></tr>
    <tr><td class="paramdir">[out]</td><td class="paramname">statistical_weights</td><td>stores the computed statistical weights </td></tr>
    <tr><td class="paramdir">[out]</td><td class="paramname">learned_weights</td><td>stores the computed learned weights </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;{</div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160;  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> number_of_classes = *std::max_element (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>.begin (), <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>.end () ) + 1;</div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160;  <span class="comment">//Temporary variable</span></div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160;  std::vector&lt;float&gt; vec;</div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160;  vec.resize (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab74fef9c7fed6a762448dd89f9210e12">number_of_clusters_</a>, 0.0f);</div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160;  statistical_weights.clear ();</div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;  learned_weights.clear ();</div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;  statistical_weights.resize (number_of_classes, vec);</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160;  learned_weights.resize (locations.size (), 0.0f);</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; </div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160;  <span class="comment">//Temporary variable</span></div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;  std::vector&lt;int&gt; vect;</div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160;  vect.resize (*std::max_element (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>.begin (), <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>.end () ) + 1, 0);</div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; </div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160;  <span class="comment">//Number of features from which c_i was learned</span></div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160;  std::vector&lt;int&gt; n_ftr;</div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; </div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160;  <span class="comment">//Total number of votes from visual word v_j</span></div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160;  std::vector&lt;int&gt; n_vot;</div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; </div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;  <span class="comment">//Number of visual words that vote for class c_i</span></div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160;  std::vector&lt;int&gt; n_vw;</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; </div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;  <span class="comment">//Number of votes for class c_i from v_j</span></div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;  std::vector&lt;std::vector&lt;int&gt; &gt; n_vot_2;</div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; </div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;  n_vot_2.resize (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab74fef9c7fed6a762448dd89f9210e12">number_of_clusters_</a>, vect);</div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160;  n_vot.resize (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab74fef9c7fed6a762448dd89f9210e12">number_of_clusters_</a>, 0);</div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160;  n_ftr.resize (number_of_classes, 0);</div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i_location = 0; i_location &lt; locations.size (); i_location++)</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;  {</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160;    <span class="keywordtype">int</span> i_class = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>[locations[i_location].model_num_];</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;    <span class="keywordtype">int</span> i_cluster = labels (i_location);</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;    n_vot_2[i_cluster][i_class] += 1;</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160;    n_vot[i_cluster] += 1;</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;    n_ftr[i_class] += 1;</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;  }</div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160; </div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160;  n_vw.resize (number_of_classes, 0);</div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_class = 0; i_class &lt; number_of_classes; i_class++)</div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_cluster = 0; i_cluster &lt; <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab74fef9c7fed6a762448dd89f9210e12">number_of_clusters_</a>; i_cluster++)</div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;      <span class="keywordflow">if</span> (n_vot_2[i_cluster][i_class] &gt; 0)</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;        n_vw[i_class] += 1;</div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160; </div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160;  <span class="comment">//computing learned weights</span></div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160;  learned_weights.resize (locations.size (), 0.0);</div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_cluster = 0; i_cluster &lt; <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab74fef9c7fed6a762448dd89f9210e12">number_of_clusters_</a>; i_cluster++)</div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160;  {</div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> number_of_words_in_cluster = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span> (clusters[i_cluster].size ());</div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_visual_word = 0; i_visual_word &lt; number_of_words_in_cluster; i_visual_word++)</div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160;    {</div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;      <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_index = clusters[i_cluster][i_visual_word];</div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160;      <span class="keywordtype">int</span> i_class = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>[locations[i_index].model_num_];</div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160;      <span class="keywordtype">float</span> square_sigma_dist = sigmas[i_class] * sigmas[i_class];</div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;      <span class="keywordflow">if</span> (square_sigma_dist &lt; std::numeric_limits&lt;float&gt;::epsilon ())</div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160;      {</div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160;        std::vector&lt;float&gt; calculated_sigmas;</div>
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160;        <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab5390e2ac51390339be681e644a1bdc9">calculateSigmas</a> (calculated_sigmas);</div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160;        square_sigma_dist = calculated_sigmas[i_class] * calculated_sigmas[i_class];</div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;        <span class="keywordflow">if</span> (square_sigma_dist &lt; std::numeric_limits&lt;float&gt;::epsilon ())</div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160;          <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;      }</div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;      Eigen::Matrix3f transform = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a1d9b74d62021c431e5519a0546b888c5">alignYCoordWithNormal</a> (locations[i_index].normal_);</div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;      Eigen::Vector3f direction = locations[i_index].dir_to_center_.getVector3fMap ();</div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160;      <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a1ba2c5aed4e6ca83a4c43e51c0f8b915">applyTransform</a> (direction, transform);</div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160;      Eigen::Vector3f actual_center = locations[i_index].point_.getVector3fMap () + direction;</div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160; </div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;      <span class="comment">//collect gaussian weighted distances</span></div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;      std::vector&lt;float&gt; gauss_dists;</div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;      <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j_visual_word = 0; j_visual_word &lt; number_of_words_in_cluster; j_visual_word++)</div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;      {</div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j_index = clusters[i_cluster][j_visual_word];</div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;        <span class="keywordtype">int</span> j_class = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>[locations[j_index].model_num_];</div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160;        <span class="keywordflow">if</span> (i_class != j_class)</div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;          <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;        <span class="comment">//predict center</span></div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;        Eigen::Matrix3f transform_2 = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a1d9b74d62021c431e5519a0546b888c5">alignYCoordWithNormal</a> (locations[j_index].normal_);</div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;        Eigen::Vector3f direction_2 = locations[i_index].dir_to_center_.getVector3fMap ();</div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;        <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a1ba2c5aed4e6ca83a4c43e51c0f8b915">applyTransform</a> (direction_2, transform_2);</div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;        Eigen::Vector3f predicted_center = locations[j_index].point_.getVector3fMap () + direction_2;</div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;        <span class="keywordtype">float</span> residual = (predicted_center - actual_center).norm ();</div>
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;        <span class="keywordtype">float</span> value = -residual * residual / square_sigma_dist;</div>
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;        gauss_dists.push_back (<span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (exp (value)));</div>
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160;      }<span class="comment">//next word</span></div>
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160;      <span class="comment">//find median gaussian weighted distance</span></div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;      <span class="keywordtype">size_t</span> mid_elem = (gauss_dists.size () - 1) / 2;</div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;      std::nth_element (gauss_dists.begin (), gauss_dists.begin () + mid_elem, gauss_dists.end ());</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;      learned_weights[i_index] = *(gauss_dists.begin () + mid_elem);</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;    }<span class="comment">//next word</span></div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;  }<span class="comment">//next cluster</span></div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160; </div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;  <span class="comment">//computing statistical weights</span></div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_cluster = 0; i_cluster &lt; <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab74fef9c7fed6a762448dd89f9210e12">number_of_clusters_</a>; i_cluster++)</div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;  {</div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_class = 0; i_class &lt; number_of_classes; i_class++)</div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;    {</div>
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160;      <span class="keywordflow">if</span> (n_vot_2[i_cluster][i_class] == 0)</div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;        <span class="keywordflow">continue</span>;<span class="comment">//no votes per class of interest in this cluster</span></div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160;      <span class="keywordflow">if</span> (n_vw[i_class] == 0)</div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160;        <span class="keywordflow">continue</span>;<span class="comment">//there were no objects of this class in the training dataset</span></div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;      <span class="keywordflow">if</span> (n_vot[i_cluster] == 0)</div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160;        <span class="keywordflow">continue</span>;<span class="comment">//this cluster has never been used</span></div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;      <span class="keywordflow">if</span> (n_ftr[i_class] == 0)</div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;        <span class="keywordflow">continue</span>;<span class="comment">//there were no objects of this class in the training dataset</span></div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160;      <span class="keywordtype">float</span> part_1 = <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (n_vw[i_class]);</div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;      <span class="keywordtype">float</span> part_2 = <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (n_vot[i_cluster]);</div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160;      <span class="keywordtype">float</span> part_3 = <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (n_vot_2[i_cluster][i_class]) / <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (n_ftr[i_class]);</div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160;      <span class="keywordtype">float</span> part_4 = 0.0f;</div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; </div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160;      <span class="keywordflow">if</span> (!<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aaf6529639183fac2a343afad1329c389">n_vot_ON_</a>)</div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160;        part_2 = 1.0f;</div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160; </div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;      <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j_class = 0; j_class &lt; number_of_classes; j_class++)</div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;        <span class="keywordflow">if</span> (n_ftr[j_class] != 0)</div>
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;          part_4 += <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (n_vot_2[i_cluster][j_class]) / <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (n_ftr[j_class]);</div>
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160; </div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;      statistical_weights[i_class][i_cluster] = (1.0f / part_1) * (1.0f / part_2) * part_3 / part_4;</div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160;    }</div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160;  }<span class="comment">//next cluster</span></div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;}</div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_a1ba2c5aed4e6ca83a4c43e51c0f8b915"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a1ba2c5aed4e6ca83a4c43e51c0f8b915">pcl::ism::ImplicitShapeModelEstimation::applyTransform</a></div><div class="ttdeci">void applyTransform(Eigen::Vector3f &amp;io_vec, const Eigen::Matrix3f &amp;in_transform)</div><div class="ttdoc">This method applies transform set in in_transform to vector io_vector.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.hpp:1233</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_a1d9b74d62021c431e5519a0546b888c5"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a1d9b74d62021c431e5519a0546b888c5">pcl::ism::ImplicitShapeModelEstimation::alignYCoordWithNormal</a></div><div class="ttdeci">Eigen::Matrix3f alignYCoordWithNormal(const NormalT &amp;in_normal)</div><div class="ttdoc">This method simply computes the rotation matrix, so that the given normal would match the Y axis afte...</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.hpp:1202</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_aaf6529639183fac2a343afad1329c389"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aaf6529639183fac2a343afad1329c389">pcl::ism::ImplicitShapeModelEstimation::n_vot_ON_</a></div><div class="ttdeci">bool n_vot_ON_</div><div class="ttdoc">If set to false then Nvot coeff from [Knopp et al., 2010, (4)] is equal 1.0.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.h:607</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_ab5390e2ac51390339be681e644a1bdc9"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab5390e2ac51390339be681e644a1bdc9">pcl::ism::ImplicitShapeModelEstimation::calculateSigmas</a></div><div class="ttdeci">void calculateSigmas(std::vector&lt; float &gt; &amp;sigmas)</div><div class="ttdoc">This method calculates the value of sigma used for calculating the learned weights for every single c...</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.hpp:942</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_ab74fef9c7fed6a762448dd89f9210e12"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab74fef9c7fed6a762448dd89f9210e12">pcl::ism::ImplicitShapeModelEstimation::number_of_clusters_</a></div><div class="ttdeci">unsigned int number_of_clusters_</div><div class="ttdoc">Number of clusters, is used for clustering descriptors during the training.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.h:604</div></div>
</div><!-- fragment -->
</div>
</div>
<a id="accdd4bb97e49ade2295cd49f59e78eba"></a>
<h2 class="memtitle"><span class="permalink"><a href="#accdd4bb97e49ade2295cd49f59e78eba">&#9670;&nbsp;</a></span>clusterDescriptors()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">bool <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::clusterDescriptors </td>
          <td>(</td>
          <td class="paramtype">std::vector&lt; <a class="el" href="structpcl_1_1_histogram.html">pcl::Histogram</a>&lt; FeatureSize &gt; &gt; &amp;&#160;</td>
          <td class="paramname"><em>histograms</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">Eigen::MatrixXi &amp;&#160;</td>
          <td class="paramname"><em>labels</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">Eigen::MatrixXf &amp;&#160;</td>
          <td class="paramname"><em>clusters_centers</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">protected</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>This method performs descriptor clustering. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">histograms</td><td>descriptors to cluster </td></tr>
    <tr><td class="paramdir">[out]</td><td class="paramname">labels</td><td>it contains labels for each descriptor </td></tr>
    <tr><td class="paramdir">[out]</td><td class="paramname">clusters_centers</td><td>stores the centers of clusters </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;{</div>
<div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;  Eigen::MatrixXf points_to_cluster (histograms.size (), FeatureSize);</div>
<div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160; </div>
<div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_feature = 0; i_feature &lt; histograms.size (); i_feature++)</div>
<div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_dim = 0; i_dim &lt; FeatureSize; i_dim++)</div>
<div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;      points_to_cluster (i_feature, i_dim) = histograms[i_feature].histogram[i_dim];</div>
<div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160; </div>
<div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;  labels.resize (histograms.size(), 1);</div>
<div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a6e7cc25fdb5957ffb10cc45cffdfc144">computeKMeansClustering</a> (</div>
<div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;    points_to_cluster,</div>
<div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;    <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab74fef9c7fed6a762448dd89f9210e12">number_of_clusters_</a>,</div>
<div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;    labels,</div>
<div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;    <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a2110e36af289f3b172a1aecff09e300c">TermCriteria</a>(TermCriteria::EPS|TermCriteria::COUNT, 10, 0.01f),<span class="comment">//1000</span></div>
<div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;    5,</div>
<div class="line"><a name="l00934"></a><span class="lineno">  934</span>&#160;    <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a95927f44e0c0364766cd4fc0ceace646">PP_CENTERS</a>,</div>
<div class="line"><a name="l00935"></a><span class="lineno">  935</span>&#160;    clusters_centers);</div>
<div class="line"><a name="l00936"></a><span class="lineno">  936</span>&#160; </div>
<div class="line"><a name="l00937"></a><span class="lineno">  937</span>&#160;  <span class="keywordflow">return</span> (<span class="keyword">true</span>);</div>
<div class="line"><a name="l00938"></a><span class="lineno">  938</span>&#160;}</div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_a2110e36af289f3b172a1aecff09e300c"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a2110e36af289f3b172a1aecff09e300c">pcl::ism::ImplicitShapeModelEstimation::TermCriteria</a></div><div class="ttdeci">struct PCL_EXPORTS pcl::ism::ImplicitShapeModelEstimation::TC TermCriteria</div><div class="ttdoc">This structure is used for determining the end of the k-means clustering process.</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_a6e7cc25fdb5957ffb10cc45cffdfc144"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a6e7cc25fdb5957ffb10cc45cffdfc144">pcl::ism::ImplicitShapeModelEstimation::computeKMeansClustering</a></div><div class="ttdeci">double computeKMeansClustering(const Eigen::MatrixXf &amp;points_to_cluster, int number_of_clusters, Eigen::MatrixXi &amp;io_labels, TermCriteria criteria, int attempts, int flags, Eigen::MatrixXf &amp;cluster_centers)</div><div class="ttdoc">Performs K-means clustering.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.hpp:1265</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_a95927f44e0c0364766cd4fc0ceace646"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a95927f44e0c0364766cd4fc0ceace646">pcl::ism::ImplicitShapeModelEstimation::PP_CENTERS</a></div><div class="ttdeci">static const int PP_CENTERS</div><div class="ttdoc">This const value is used for indicating that for k-means clustering centers must be generated as desc...</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.h:612</div></div>
</div><!-- fragment -->
</div>
</div>
<a id="a4f7f33ad9a8cec7886f8746b45165095"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4f7f33ad9a8cec7886f8746b45165095">&#9670;&nbsp;</a></span>computeDistance()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">float <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::computeDistance </td>
          <td>(</td>
          <td class="paramtype">Eigen::VectorXf &amp;&#160;</td>
          <td class="paramname"><em>vec_1</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">Eigen::VectorXf &amp;&#160;</td>
          <td class="paramname"><em>vec_2</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">protected</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Computes the square distance beetween two vectors. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">vec_1</td><td>first vector </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">vec_2</td><td>second vector </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160;{</div>
<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160;  <span class="keywordtype">size_t</span> dimension = vec_1.rows () &gt; 1 ? vec_1.rows () : vec_1.cols ();</div>
<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>&#160;  <span class="keywordtype">float</span> <a class="code" href="common_2include_2pcl_2common_2geometry_8h.html#a2fc89f0c26b7c7377fcd2851fa933b87">distance</a> = 0.0f;</div>
<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160;  <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_dim = 0; i_dim &lt; dimension; i_dim++)</div>
<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160;  {</div>
<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;    <span class="keywordtype">float</span> diff = vec_1 (i_dim) - vec_2 (i_dim);</div>
<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;    <a class="code" href="common_2include_2pcl_2common_2geometry_8h.html#a2fc89f0c26b7c7377fcd2851fa933b87">distance</a> += diff * diff;</div>
<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;  }</div>
<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160; </div>
<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;  <span class="keywordflow">return</span> (distance);</div>
<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160;}</div>
<div class="ttc" id="acommon_2include_2pcl_2common_2geometry_8h_html_a2fc89f0c26b7c7377fcd2851fa933b87"><div class="ttname"><a href="common_2include_2pcl_2common_2geometry_8h.html#a2fc89f0c26b7c7377fcd2851fa933b87">pcl::geometry::distance</a></div><div class="ttdeci">float distance(const PointT &amp;p1, const PointT &amp;p2)</div><div class="ttdef"><b>Definition:</b> geometry.h:60</div></div>
</div><!-- fragment -->
</div>
</div>
<a id="a6e7cc25fdb5957ffb10cc45cffdfc144"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6e7cc25fdb5957ffb10cc45cffdfc144">&#9670;&nbsp;</a></span>computeKMeansClustering()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">double <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::computeKMeansClustering </td>
          <td>(</td>
          <td class="paramtype">const Eigen::MatrixXf &amp;&#160;</td>
          <td class="paramname"><em>points_to_cluster</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>number_of_clusters</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">Eigen::MatrixXi &amp;&#160;</td>
          <td class="paramname"><em>io_labels</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a2110e36af289f3b172a1aecff09e300c">TermCriteria</a>&#160;</td>
          <td class="paramname"><em>criteria</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>attempts</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>flags</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">Eigen::MatrixXf &amp;&#160;</td>
          <td class="paramname"><em>cluster_centers</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">protected</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Performs K-means clustering. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">points_to_cluster</td><td>points to cluster </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">number_of_clusters</td><td>desired number of clusters </td></tr>
    <tr><td class="paramdir">[out]</td><td class="paramname">io_labels</td><td>output parameter, which stores the label for each point </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">criteria</td><td>defines when the computational process need to be finished. For example if the desired accuracy is achieved or the iteration number exceeds given value </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">attempts</td><td>number of attempts to compute clustering </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">flags</td><td>if set to USE_INITIAL_LABELS then initial approximation of labels is taken from io_labels </td></tr>
    <tr><td class="paramdir">[out]</td><td class="paramname">cluster_centers</td><td>it will store the cluster centers </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160;{</div>
<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160;  <span class="keyword">const</span> <span class="keywordtype">int</span> spp_trials = 3;</div>
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160;  <span class="keywordtype">size_t</span> number_of_points = points_to_cluster.rows () &gt; 1 ? points_to_cluster.rows () : points_to_cluster.cols ();</div>
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160;  <span class="keywordtype">int</span> feature_dimension = points_to_cluster.rows () &gt; 1 ? FeatureSize : 1;</div>
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160; </div>
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160;  attempts = std::max (attempts, 1);</div>
<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;  srand (<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span> (time (0)));</div>
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160; </div>
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160;  Eigen::MatrixXi labels (number_of_points, 1);</div>
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160; </div>
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160;  <span class="keywordflow">if</span> (flags &amp; <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ad32395d4f6b46da4433911b29045b5b5">USE_INITIAL_LABELS</a>)</div>
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160;    labels = io_labels;</div>
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160;  <span class="keywordflow">else</span></div>
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160;    labels.setZero ();</div>
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160; </div>
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160;  Eigen::MatrixXf centers (number_of_clusters, feature_dimension);</div>
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160;  Eigen::MatrixXf old_centers (number_of_clusters, feature_dimension);</div>
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160;  std::vector&lt;int&gt; counters (number_of_clusters);</div>
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160;  std::vector&lt;Eigen::Vector2f, Eigen::aligned_allocator&lt;Eigen::Vector2f&gt; &gt; boxes (feature_dimension);</div>
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160;  Eigen::Vector2f* box = &amp;boxes[0];</div>
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>&#160; </div>
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160;  <span class="keywordtype">double</span> best_compactness = std::numeric_limits&lt;double&gt;::max ();</div>
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160;  <span class="keywordtype">double</span> compactness = 0.0;</div>
<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160; </div>
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160;  <span class="keywordflow">if</span> (criteria.type_ &amp; TermCriteria::EPS)</div>
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160;    criteria.epsilon_ = std::max (criteria.epsilon_, 0.0f);</div>
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160;  <span class="keywordflow">else</span></div>
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>&#160;    criteria.epsilon_ = std::numeric_limits&lt;float&gt;::epsilon ();</div>
<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160; </div>
<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160;  criteria.epsilon_ *= criteria.epsilon_;</div>
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160; </div>
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160;  <span class="keywordflow">if</span> (criteria.type_ &amp; TermCriteria::COUNT)</div>
<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160;    criteria.max_count_ = std::min (std::max (criteria.max_count_, 2), 100);</div>
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160;  <span class="keywordflow">else</span></div>
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160;    criteria.max_count_ = 100;</div>
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160; </div>
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160;  <span class="keywordflow">if</span> (number_of_clusters == 1)</div>
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160;  {</div>
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;    attempts = 1;</div>
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160;    criteria.max_count_ = 2;</div>
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160;  }</div>
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160; </div>
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_dim = 0; i_dim &lt; feature_dimension; i_dim++)</div>
<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160;    box[i_dim] = Eigen::Vector2f (points_to_cluster (0, i_dim), points_to_cluster (0, i_dim));</div>
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160; </div>
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_point = 0; i_point &lt; number_of_points; i_point++)</div>
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_dim = 0; i_dim &lt; feature_dimension; i_dim++)</div>
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160;    {</div>
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160;      <span class="keywordtype">float</span> v = points_to_cluster (i_point, i_dim);</div>
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160;      box[i_dim] (0) = std::min (box[i_dim] (0), v);</div>
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160;      box[i_dim] (1) = std::max (box[i_dim] (1), v);</div>
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160;    }</div>
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160; </div>
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_attempt = 0; i_attempt &lt; attempts; i_attempt++)</div>
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;  {</div>
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160;    <span class="keywordtype">float</span> max_center_shift = std::numeric_limits&lt;float&gt;::max ();</div>
<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> iter = 0; iter &lt; criteria.max_count_ &amp;&amp; max_center_shift &gt; criteria.epsilon_; iter++)</div>
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160;    {</div>
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160;      Eigen::MatrixXf temp (centers.rows (), centers.cols ());</div>
<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160;      temp = centers;</div>
<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160;      centers = old_centers;</div>
<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160;      old_centers = temp;</div>
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160; </div>
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160;      <span class="keywordflow">if</span> ( iter == 0 &amp;&amp; ( i_attempt &gt; 0 || !(flags &amp; <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ad32395d4f6b46da4433911b29045b5b5">USE_INITIAL_LABELS</a>) ) )</div>
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160;      {</div>
<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160;        <span class="keywordflow">if</span> (flags &amp; <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a95927f44e0c0364766cd4fc0ceace646">PP_CENTERS</a>)</div>
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160;          <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a6a0f8e46d933e4b93b320a2c9682db84">generateCentersPP</a> (points_to_cluster, centers, number_of_clusters, spp_trials);</div>
<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160;        <span class="keywordflow">else</span></div>
<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160;        {</div>
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160;          <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_cl_center = 0; i_cl_center &lt; number_of_clusters; i_cl_center++)</div>
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160;          {</div>
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160;            Eigen::VectorXf center (feature_dimension);</div>
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160;            <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a33688b88157c6d8b15290ed88646effb">generateRandomCenter</a> (boxes, center);</div>
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160;            <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_dim = 0; i_dim &lt; feature_dimension; i_dim++)</div>
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160;              centers (i_cl_center, i_dim) = center (i_dim);</div>
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160;          }<span class="comment">//generate center for next cluster</span></div>
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160;        }<span class="comment">//end if-else random or PP centers</span></div>
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>&#160;      }</div>
<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>&#160;      <span class="keywordflow">else</span></div>
<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160;      {</div>
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160;        centers.setZero ();</div>
<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_cluster = 0; i_cluster &lt; number_of_clusters; i_cluster++)</div>
<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160;          counters[i_cluster] = 0;</div>
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_point = 0; i_point &lt; number_of_points; i_point++)</div>
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;        {</div>
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160;          <span class="keywordtype">int</span> i_label = labels (i_point, 0);</div>
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160;          <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_dim = 0; i_dim &lt; feature_dimension; i_dim++)</div>
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160;            centers (i_label, i_dim) += points_to_cluster (i_point, i_dim);</div>
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160;          counters[i_label]++;</div>
<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160;        }</div>
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160;        <span class="keywordflow">if</span> (iter &gt; 0)</div>
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160;          max_center_shift = 0.0f;</div>
<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_cl_center = 0; i_cl_center &lt; number_of_clusters; i_cl_center++)</div>
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160;        {</div>
<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160;          <span class="keywordflow">if</span> (counters[i_cl_center] != 0)</div>
<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160;          {</div>
<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160;            <span class="keywordtype">float</span> scale = 1.0f / <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (counters[i_cl_center]);</div>
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160;            <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_dim = 0; i_dim &lt; feature_dimension; i_dim++)</div>
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160;              centers (i_cl_center, i_dim) *= scale;</div>
<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160;          }</div>
<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160;          <span class="keywordflow">else</span></div>
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160;          {</div>
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160;            Eigen::VectorXf center (feature_dimension);</div>
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160;            <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a33688b88157c6d8b15290ed88646effb">generateRandomCenter</a> (boxes, center);</div>
<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i_dim = 0; i_dim &lt; feature_dimension; i_dim++)</div>
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160;              centers (i_cl_center, i_dim) = center (i_dim);</div>
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160;          }</div>
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160; </div>
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;          <span class="keywordflow">if</span> (iter &gt; 0)</div>
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160;          {</div>
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160;            <span class="keywordtype">float</span> dist = 0.0f;</div>
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;            <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_dim = 0; i_dim &lt; feature_dimension; i_dim++)</div>
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;            {</div>
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;              <span class="keywordtype">float</span> diff = centers (i_cl_center, i_dim) - old_centers (i_cl_center, i_dim);</div>
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160;              dist += diff * diff;</div>
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;            }</div>
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160;            max_center_shift = std::max (max_center_shift, dist);</div>
<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160;          }</div>
<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>&#160;        }</div>
<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160;      }</div>
<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160;      compactness = 0.0f;</div>
<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160;      <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_point = 0; i_point &lt; number_of_points; i_point++)</div>
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160;      {</div>
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;        Eigen::VectorXf sample (feature_dimension);</div>
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160;        sample = points_to_cluster.row (i_point);</div>
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160; </div>
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160;        <span class="keywordtype">int</span> k_best = 0;</div>
<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160;        <span class="keywordtype">float</span> min_dist = std::numeric_limits&lt;float&gt;::max ();</div>
<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160; </div>
<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_cluster = 0; i_cluster &lt; number_of_clusters; i_cluster++)</div>
<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160;        {</div>
<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160;          Eigen::VectorXf center (feature_dimension);</div>
<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160;          center = centers.row (i_cluster);</div>
<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160;          <span class="keywordtype">float</span> dist = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a4f7f33ad9a8cec7886f8746b45165095">computeDistance</a> (sample, center);</div>
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;          <span class="keywordflow">if</span> (min_dist &gt; dist)</div>
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160;          {</div>
<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;            min_dist = dist;</div>
<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160;            k_best = i_cluster;</div>
<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160;          }</div>
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;        }</div>
<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;        compactness += min_dist;</div>
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;        labels (i_point, 0) = k_best;</div>
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160;      }</div>
<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;    }<span class="comment">//next iteration</span></div>
<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160; </div>
<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160;    <span class="keywordflow">if</span> (compactness &lt; best_compactness)</div>
<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160;    {</div>
<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>&#160;      best_compactness = compactness;</div>
<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>&#160;      cluster_centers = centers;</div>
<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160;      io_labels = labels;</div>
<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160;    }</div>
<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160;  }<span class="comment">//next attempt</span></div>
<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160; </div>
<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160;  <span class="keywordflow">return</span> (best_compactness);</div>
<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160;}</div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_a33688b88157c6d8b15290ed88646effb"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a33688b88157c6d8b15290ed88646effb">pcl::ism::ImplicitShapeModelEstimation::generateRandomCenter</a></div><div class="ttdeci">void generateRandomCenter(const std::vector&lt; Eigen::Vector2f, Eigen::aligned_allocator&lt; Eigen::Vector2f &gt; &gt; &amp;boxes, Eigen::VectorXf &amp;center)</div><div class="ttdoc">Generates random center for cluster.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.hpp:1507</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_a4f7f33ad9a8cec7886f8746b45165095"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a4f7f33ad9a8cec7886f8746b45165095">pcl::ism::ImplicitShapeModelEstimation::computeDistance</a></div><div class="ttdeci">float computeDistance(Eigen::VectorXf &amp;vec_1, Eigen::VectorXf &amp;vec_2)</div><div class="ttdoc">Computes the square distance beetween two vectors.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.hpp:1523</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_a6a0f8e46d933e4b93b320a2c9682db84"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a6a0f8e46d933e4b93b320a2c9682db84">pcl::ism::ImplicitShapeModelEstimation::generateCentersPP</a></div><div class="ttdeci">void generateCentersPP(const Eigen::MatrixXf &amp;data, Eigen::MatrixXf &amp;out_centers, int number_of_clusters, int trials)</div><div class="ttdoc">Generates centers for clusters as described in Arthur, David and Sergei Vassilvitski (2007) k-means++...</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.hpp:1431</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_ad32395d4f6b46da4433911b29045b5b5"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ad32395d4f6b46da4433911b29045b5b5">pcl::ism::ImplicitShapeModelEstimation::USE_INITIAL_LABELS</a></div><div class="ttdeci">static const int USE_INITIAL_LABELS</div><div class="ttdoc">This const value is used for indicating that input labels must be taken as the initial approximation ...</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.h:616</div></div>
</div><!-- fragment -->
</div>
</div>
<a id="a95ecb201992f3fcc3b0df7f30d1db105"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a95ecb201992f3fcc3b0df7f30d1db105">&#9670;&nbsp;</a></span>estimateFeatures()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::estimateFeatures </td>
          <td>(</td>
          <td class="paramtype">typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt;::Ptr&#160;</td>
          <td class="paramname"><em>sampled_point_cloud</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::Ptr&#160;</td>
          <td class="paramname"><em>normal_cloud</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_histogram.html">pcl::Histogram</a>&lt; FeatureSize &gt; &gt;::Ptr&#160;</td>
          <td class="paramname"><em>feature_cloud</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">protected</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>This method estimates features for the given point cloud. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">sampled_point_cloud</td><td>sampled point cloud for which the features must be computed </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">normal_cloud</td><td>normals for the original point cloud </td></tr>
    <tr><td class="paramdir">[out]</td><td class="paramname">feature_cloud</td><td>it will store the computed histograms (features) for the given cloud </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;{</div>
<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;  <span class="keyword">typename</span> pcl::search::Search&lt;PointT&gt;::Ptr tree = boost::shared_ptr&lt;pcl::search::Search&lt;PointT&gt; &gt; (<span class="keyword">new</span> <a class="code" href="classpcl_1_1search_1_1_kd_tree.html">pcl::search::KdTree&lt;PointT&gt;</a>);</div>
<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160;<span class="comment">//  tree-&gt;setInputCloud (point_cloud);</span></div>
<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160; </div>
<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a59c6f181873500f38df1d7eab07a67cb">feature_estimator_</a>-&gt;setInputCloud (sampled_point_cloud-&gt;makeShared ());</div>
<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160;<span class="comment">//  feature_estimator_-&gt;setSearchSurface (point_cloud-&gt;makeShared ());</span></div>
<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a59c6f181873500f38df1d7eab07a67cb">feature_estimator_</a>-&gt;setSearchMethod (tree);</div>
<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160; </div>
<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160;<span class="comment">//  typename pcl::SpinImageEstimation&lt;pcl::PointXYZ, pcl::Normal, pcl::Histogram&lt;FeatureSize&gt; &gt;::Ptr feat_est_norm =</span></div>
<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160;<span class="comment">//    boost::dynamic_pointer_cast&lt;pcl::SpinImageEstimation&lt;pcl::PointXYZ, pcl::Normal, pcl::Histogram&lt;FeatureSize&gt; &gt; &gt; (feature_estimator_);</span></div>
<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;<span class="comment">//  feat_est_norm-&gt;setInputNormals (normal_cloud);</span></div>
<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160; </div>
<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160;  <span class="keyword">typename</span> <a class="code" href="classpcl_1_1_feature_from_normals.html">pcl::FeatureFromNormals&lt;pcl::PointXYZ, pcl::Normal, pcl::Histogram&lt;FeatureSize&gt;</a> &gt;::Ptr feat_est_norm =</div>
<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;    boost::dynamic_pointer_cast&lt;pcl::FeatureFromNormals&lt;pcl::PointXYZ, pcl::Normal, pcl::Histogram&lt;FeatureSize&gt; &gt; &gt; (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a59c6f181873500f38df1d7eab07a67cb">feature_estimator_</a>);</div>
<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;  feat_est_norm-&gt;<a class="code" href="classpcl_1_1_feature_from_normals.html#a349685ac9deb723502de9f399d0286dc">setInputNormals</a> (normal_cloud);</div>
<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160; </div>
<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a59c6f181873500f38df1d7eab07a67cb">feature_estimator_</a>-&gt;compute (*feature_cloud);</div>
<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;}</div>
<div class="ttc" id="aclasspcl_1_1_feature_from_normals_html"><div class="ttname"><a href="classpcl_1_1_feature_from_normals.html">pcl::FeatureFromNormals</a></div><div class="ttdef"><b>Definition:</b> feature.h:311</div></div>
<div class="ttc" id="aclasspcl_1_1_feature_from_normals_html_a349685ac9deb723502de9f399d0286dc"><div class="ttname"><a href="classpcl_1_1_feature_from_normals.html#a349685ac9deb723502de9f399d0286dc">pcl::FeatureFromNormals::setInputNormals</a></div><div class="ttdeci">void setInputNormals(const PointCloudNConstPtr &amp;normals)</div><div class="ttdoc">Provide a pointer to the input dataset that contains the point normals of the XYZ dataset....</div><div class="ttdef"><b>Definition:</b> feature.h:344</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_a59c6f181873500f38df1d7eab07a67cb"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a59c6f181873500f38df1d7eab07a67cb">pcl::ism::ImplicitShapeModelEstimation::feature_estimator_</a></div><div class="ttdeci">boost::shared_ptr&lt; pcl::Feature&lt; PointT, pcl::Histogram&lt; FeatureSize &gt; &gt; &gt; feature_estimator_</div><div class="ttdoc">Stores the feature estimator.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.h:601</div></div>
<div class="ttc" id="aclasspcl_1_1search_1_1_kd_tree_html"><div class="ttname"><a href="classpcl_1_1search_1_1_kd_tree.html">pcl::search::KdTree</a></div><div class="ttdoc">search::KdTree is a wrapper class which inherits the pcl::KdTree class for performing search function...</div><div class="ttdef"><b>Definition:</b> kdtree.h:63</div></div>
</div><!-- fragment -->
</div>
</div>
<a id="aada2c42e9685032c4cd2beb2a29b157c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aada2c42e9685032c4cd2beb2a29b157c">&#9670;&nbsp;</a></span>extractDescriptors()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">bool <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::extractDescriptors </td>
          <td>(</td>
          <td class="paramtype">std::vector&lt; <a class="el" href="structpcl_1_1_histogram.html">pcl::Histogram</a>&lt; FeatureSize &gt; &gt; &amp;&#160;</td>
          <td class="paramname"><em>histograms</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">std::vector&lt; <a class="el" href="structpcl_1_1ism_1_1_implicit_shape_model_estimation_1_1_location_info.html">LocationInfo</a>, Eigen::aligned_allocator&lt; <a class="el" href="structpcl_1_1ism_1_1_implicit_shape_model_estimation_1_1_location_info.html">LocationInfo</a> &gt; &gt; &amp;&#160;</td>
          <td class="paramname"><em>locations</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">protected</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Extracts the descriptors from the input clouds. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[out]</td><td class="paramname">histograms</td><td>it will store the descriptors for each key point </td></tr>
    <tr><td class="paramdir">[out]</td><td class="paramname">locations</td><td>it will contain the comprehensive information (such as direction, initial keypoint) for the corresponding descriptors </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;{</div>
<div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;  histograms.clear ();</div>
<div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;  locations.clear ();</div>
<div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160; </div>
<div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;  <span class="keywordtype">int</span> n_key_points = 0;</div>
<div class="line"><a name="l00857"></a><span class="lineno">  857</span>&#160; </div>
<div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>.size () == 0 || <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>.size () == 0 || <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a59c6f181873500f38df1d7eab07a67cb">feature_estimator_</a> == 0)</div>
<div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;    <span class="keywordflow">return</span> (<span class="keyword">false</span>);</div>
<div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160; </div>
<div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i_cloud = 0; i_cloud &lt; <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>.size (); i_cloud++)</div>
<div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;  {</div>
<div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;    <span class="comment">//compute the center of the training object</span></div>
<div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;    Eigen::Vector3f models_center (0.0f, 0.0f, 0.0f);</div>
<div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> num_of_points =  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>[i_cloud]-&gt;points.size ();</div>
<div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;    <span class="keyword">typename</span> pcl::PointCloud&lt;PointT&gt;::iterator point_j;</div>
<div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;    <span class="keywordflow">for</span> (point_j = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>[i_cloud]-&gt;begin (); point_j != <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>[i_cloud]-&gt;end (); point_j++)</div>
<div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;      models_center += point_j-&gt;getVector3fMap ();</div>
<div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;    models_center /= <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (num_of_points);</div>
<div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160; </div>
<div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;    <span class="comment">//downsample the cloud</span></div>
<div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;    <span class="keyword">typename</span> pcl::PointCloud&lt;PointT&gt;::Ptr sampled_point_cloud (<span class="keyword">new</span> <a class="code" href="classpcl_1_1_point_cloud.html">pcl::PointCloud&lt;PointT&gt;</a> ());</div>
<div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;    <span class="keyword">typename</span> pcl::PointCloud&lt;NormalT&gt;::Ptr sampled_normal_cloud (<span class="keyword">new</span> <a class="code" href="classpcl_1_1_point_cloud.html">pcl::PointCloud&lt;NormalT&gt;</a> ());</div>
<div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;    <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aeab8318ded750cbf52cd272daeeeba98">simplifyCloud</a> (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>[i_cloud], <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a7145a95483ee85c15fb36bf0c34a4861">training_normals_</a>[i_cloud], sampled_point_cloud, sampled_normal_cloud);</div>
<div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;    <span class="keywordflow">if</span> (sampled_point_cloud-&gt;points.size () == 0)</div>
<div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160; </div>
<div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;    <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a56c5bfb3d5801c417ae72bd8f2f80316">shiftCloud</a> (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>[i_cloud], models_center);</div>
<div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;    <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a56c5bfb3d5801c417ae72bd8f2f80316">shiftCloud</a> (sampled_point_cloud, models_center);</div>
<div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160; </div>
<div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;    n_key_points += <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span> (sampled_point_cloud-&gt;size ());</div>
<div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160; </div>
<div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;    <span class="keyword">typename</span> <a class="code" href="classpcl_1_1_point_cloud.html">pcl::PointCloud&lt;pcl::Histogram&lt;FeatureSize&gt;</a> &gt;::Ptr feature_cloud (<span class="keyword">new</span> <a class="code" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt;<a class="code" href="structpcl_1_1_histogram.html">pcl::Histogram&lt;FeatureSize&gt;</a> &gt; ());</div>
<div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;    <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a95ecb201992f3fcc3b0df7f30d1db105">estimateFeatures</a> (sampled_point_cloud, sampled_normal_cloud, feature_cloud);</div>
<div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160; </div>
<div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;    <span class="keywordtype">int</span> point_index = 0;</div>
<div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;    <span class="keyword">typename</span> pcl::PointCloud&lt;PointT&gt;::iterator point_i;</div>
<div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;    <span class="keywordflow">for</span> (point_i = sampled_point_cloud-&gt;points.begin (); point_i != sampled_point_cloud-&gt;points.end (); point_i++, point_index++)</div>
<div class="line"><a name="l00889"></a><span class="lineno">  889</span>&#160;    {</div>
<div class="line"><a name="l00890"></a><span class="lineno">  890</span>&#160;      <span class="keywordtype">float</span> descriptor_sum = Eigen::VectorXf::Map (feature_cloud-&gt;points[point_index].histogram, FeatureSize).sum ();</div>
<div class="line"><a name="l00891"></a><span class="lineno">  891</span>&#160;      <span class="keywordflow">if</span> (descriptor_sum &lt; std::numeric_limits&lt;float&gt;::epsilon ())</div>
<div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;        <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160; </div>
<div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;      histograms.insert ( histograms.end (), feature_cloud-&gt;begin () + point_index, feature_cloud-&gt;begin () + point_index + 1 );</div>
<div class="line"><a name="l00895"></a><span class="lineno">  895</span>&#160; </div>
<div class="line"><a name="l00896"></a><span class="lineno">  896</span>&#160;      <span class="keywordtype">int</span> dist = <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span> (std::distance (sampled_point_cloud-&gt;points.begin (), point_i));</div>
<div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;      Eigen::Matrix3f new_basis = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a1d9b74d62021c431e5519a0546b888c5">alignYCoordWithNormal</a> (sampled_normal_cloud-&gt;points[dist]);</div>
<div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;      Eigen::Vector3f zero;</div>
<div class="line"><a name="l00899"></a><span class="lineno">  899</span>&#160;      zero (0) = 0.0;</div>
<div class="line"><a name="l00900"></a><span class="lineno">  900</span>&#160;      zero (1) = 0.0;</div>
<div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;      zero (2) = 0.0;</div>
<div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;      Eigen::Vector3f new_dir = zero - point_i-&gt;getVector3fMap ();</div>
<div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;      <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a1ba2c5aed4e6ca83a4c43e51c0f8b915">applyTransform</a> (new_dir, new_basis);</div>
<div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160; </div>
<div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;      <a class="code" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> point (new_dir[0], new_dir[1], new_dir[2]);</div>
<div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;      LocationInfo info (<span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span> (i_cloud), point, *point_i, sampled_normal_cloud-&gt;points[dist]);</div>
<div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;      locations.insert(locations.end (), info);</div>
<div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;    }</div>
<div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;  }<span class="comment">//next training cloud</span></div>
<div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160; </div>
<div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;  <span class="keywordflow">return</span> (<span class="keyword">true</span>);</div>
<div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;}</div>
<div class="ttc" id="aclasspcl_1_1_point_cloud_html"><div class="ttname"><a href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a></div><div class="ttdoc">PointCloud represents the base class in PCL for storing collections of 3D points.</div><div class="ttdef"><b>Definition:</b> point_cloud.h:173</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_a56c5bfb3d5801c417ae72bd8f2f80316"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a56c5bfb3d5801c417ae72bd8f2f80316">pcl::ism::ImplicitShapeModelEstimation::shiftCloud</a></div><div class="ttdeci">void shiftCloud(typename pcl::PointCloud&lt; PointT &gt;::Ptr in_cloud, Eigen::Vector3f shift_point)</div><div class="ttdoc">This method simply shifts the clouds points relative to the passed point.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.hpp:1187</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_a7145a95483ee85c15fb36bf0c34a4861"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a7145a95483ee85c15fb36bf0c34a4861">pcl::ism::ImplicitShapeModelEstimation::training_normals_</a></div><div class="ttdeci">std::vector&lt; typename pcl::PointCloud&lt; NormalT &gt;::Ptr &gt; training_normals_</div><div class="ttdoc">Stores the normals for each training cloud.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.h:590</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_a95ecb201992f3fcc3b0df7f30d1db105"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a95ecb201992f3fcc3b0df7f30d1db105">pcl::ism::ImplicitShapeModelEstimation::estimateFeatures</a></div><div class="ttdeci">void estimateFeatures(typename pcl::PointCloud&lt; PointT &gt;::Ptr sampled_point_cloud, typename pcl::PointCloud&lt; NormalT &gt;::Ptr normal_cloud, typename pcl::PointCloud&lt; pcl::Histogram&lt; FeatureSize &gt; &gt;::Ptr feature_cloud)</div><div class="ttdoc">This method estimates features for the given point cloud.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.hpp:1240</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_aeab8318ded750cbf52cd272daeeeba98"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aeab8318ded750cbf52cd272daeeeba98">pcl::ism::ImplicitShapeModelEstimation::simplifyCloud</a></div><div class="ttdeci">void simplifyCloud(typename pcl::PointCloud&lt; PointT &gt;::ConstPtr in_point_cloud, typename pcl::PointCloud&lt; NormalT &gt;::ConstPtr in_normal_cloud, typename pcl::PointCloud&lt; PointT &gt;::Ptr out_sampled_point_cloud, typename pcl::PointCloud&lt; NormalT &gt;::Ptr out_sampled_normal_cloud)</div><div class="ttdoc">Simplifies the cloud using voxel grid principles.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.hpp:1123</div></div>
<div class="ttc" id="astructpcl_1_1_histogram_html"><div class="ttname"><a href="structpcl_1_1_histogram.html">pcl::Histogram</a></div><div class="ttdoc">A point structure representing an N-D histogram.</div><div class="ttdef"><b>Definition:</b> point_types.hpp:1475</div></div>
<div class="ttc" id="astructpcl_1_1_point_x_y_z_r_g_b_a_html"><div class="ttname"><a href="structpcl_1_1_point_x_y_z_r_g_b_a.html">pcl::PointXYZRGBA</a></div><div class="ttdoc">A point structure representing Euclidean xyz coordinates, and the RGBA color.</div><div class="ttdef"><b>Definition:</b> point_types.hpp:540</div></div>
</div><!-- fragment -->
</div>
</div>
<a id="a16e7d9f66e627dc6e68206ffabb45c95"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a16e7d9f66e627dc6e68206ffabb45c95">&#9670;&nbsp;</a></span>findObjects()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">boost::shared_ptr&lt; <a class="el" href="classpcl_1_1features_1_1_i_s_m_vote_list.html">pcl::features::ISMVoteList</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt; &gt; <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::findObjects </td>
          <td>(</td>
          <td class="paramtype">ISMModelPtr&#160;</td>
          <td class="paramname"><em>model</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt;::Ptr&#160;</td>
          <td class="paramname"><em>in_cloud</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_normal.html">Normal</a> &gt;::Ptr&#160;</td>
          <td class="paramname"><em>in_normals</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>in_class_of_interest</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>This function is searching for the class of interest in a given cloud and returns the list of votes. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">model</td><td>trained model which will be used for searching the objects </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">in_cloud</td><td>input cloud that need to be investigated </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">in_normals</td><td>cloud of normals coresponding to the input cloud </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">in_class_of_interest</td><td>class which we are looking for </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;{</div>
<div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;  boost::shared_ptr&lt;pcl::features::ISMVoteList&lt;PointT&gt; &gt; out_votes (<span class="keyword">new</span> <a class="code" href="classpcl_1_1features_1_1_i_s_m_vote_list.html">pcl::features::ISMVoteList&lt;PointT&gt;</a> ());</div>
<div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160; </div>
<div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;  <span class="keywordflow">if</span> (in_cloud-&gt;points.size () == 0)</div>
<div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;    <span class="keywordflow">return</span> (out_votes);</div>
<div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160; </div>
<div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;  <span class="keyword">typename</span> pcl::PointCloud&lt;PointT&gt;::Ptr sampled_point_cloud (<span class="keyword">new</span> <a class="code" href="classpcl_1_1_point_cloud.html">pcl::PointCloud&lt;PointT&gt;</a> ());</div>
<div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;  <span class="keyword">typename</span> pcl::PointCloud&lt;NormalT&gt;::Ptr sampled_normal_cloud (<span class="keyword">new</span> <a class="code" href="classpcl_1_1_point_cloud.html">pcl::PointCloud&lt;NormalT&gt;</a> ());</div>
<div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aeab8318ded750cbf52cd272daeeeba98">simplifyCloud</a> (in_cloud, in_normals, sampled_point_cloud, sampled_normal_cloud);</div>
<div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;  <span class="keywordflow">if</span> (sampled_point_cloud-&gt;points.size () == 0)</div>
<div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;    <span class="keywordflow">return</span> (out_votes);</div>
<div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160; </div>
<div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;  <span class="keyword">typename</span> <a class="code" href="classpcl_1_1_point_cloud.html">pcl::PointCloud&lt;pcl::Histogram&lt;FeatureSize&gt;</a> &gt;::Ptr feature_cloud (<span class="keyword">new</span> <a class="code" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt;<a class="code" href="structpcl_1_1_histogram.html">pcl::Histogram&lt;FeatureSize&gt;</a> &gt; ());</div>
<div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a95ecb201992f3fcc3b0df7f30d1db105">estimateFeatures</a> (sampled_point_cloud, sampled_normal_cloud, feature_cloud);</div>
<div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160; </div>
<div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;  <span class="comment">//find nearest cluster</span></div>
<div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;  <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n_key_points = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span> (sampled_point_cloud-&gt;size ());</div>
<div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;  std::vector&lt;int&gt; min_dist_inds (n_key_points, -1);</div>
<div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_point = 0; i_point &lt; n_key_points; i_point++)</div>
<div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;  {</div>
<div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;    Eigen::VectorXf curr_descriptor (FeatureSize);</div>
<div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_dim = 0; i_dim &lt; FeatureSize; i_dim++)</div>
<div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;      curr_descriptor (i_dim) = feature_cloud-&gt;points[i_point].histogram[i_dim];</div>
<div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160; </div>
<div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;    <span class="keywordtype">float</span> descriptor_sum = curr_descriptor.sum ();</div>
<div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;    <span class="keywordflow">if</span> (descriptor_sum &lt; std::numeric_limits&lt;float&gt;::epsilon ())</div>
<div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160; </div>
<div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> min_dist_idx = 0;</div>
<div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;    Eigen::VectorXf clusters_center (FeatureSize);</div>
<div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_dim = 0; i_dim &lt; FeatureSize; i_dim++)</div>
<div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;      clusters_center (i_dim) = model-&gt;clusters_centers_ (min_dist_idx, i_dim);</div>
<div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160; </div>
<div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;    <span class="keywordtype">float</span> best_dist = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a4f7f33ad9a8cec7886f8746b45165095">computeDistance</a> (curr_descriptor, clusters_center);</div>
<div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_clust_cent = 0; i_clust_cent &lt; <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab74fef9c7fed6a762448dd89f9210e12">number_of_clusters_</a>; i_clust_cent++)</div>
<div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;    {</div>
<div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;      <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_dim = 0; i_dim &lt; FeatureSize; i_dim++)</div>
<div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;        clusters_center (i_dim) = model-&gt;clusters_centers_ (i_clust_cent, i_dim);</div>
<div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;      <span class="keywordtype">float</span> curr_dist = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a4f7f33ad9a8cec7886f8746b45165095">computeDistance</a> (clusters_center, curr_descriptor);</div>
<div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;      <span class="keywordflow">if</span> (curr_dist &lt; best_dist)</div>
<div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;      {</div>
<div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;        min_dist_idx = i_clust_cent;</div>
<div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;        best_dist = curr_dist;</div>
<div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;      }</div>
<div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;    }</div>
<div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;    min_dist_inds[i_point] = min_dist_idx;</div>
<div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;  }<span class="comment">//next keypoint</span></div>
<div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160; </div>
<div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i_point = 0; i_point &lt; n_key_points; i_point++)</div>
<div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;  {</div>
<div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;    <span class="keywordtype">int</span> min_dist_idx = min_dist_inds[i_point];</div>
<div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;    <span class="keywordflow">if</span> (min_dist_idx == -1)</div>
<div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160; </div>
<div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n_words = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span> (model-&gt;clusters_[min_dist_idx].size ());</div>
<div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;    <span class="comment">//compute coord system transform</span></div>
<div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;    Eigen::Matrix3f transform = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a1d9b74d62021c431e5519a0546b888c5">alignYCoordWithNormal</a> (sampled_normal_cloud-&gt;points[i_point]);</div>
<div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_word = 0; i_word &lt; n_words; i_word++)</div>
<div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;    {</div>
<div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;      <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index = model-&gt;clusters_[min_dist_idx][i_word];</div>
<div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;      <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_class = model-&gt;classes_[index];</div>
<div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;      <span class="keywordflow">if</span> (<span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span> (i_class) != in_class_of_interest)</div>
<div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;        <span class="keywordflow">continue</span>;<span class="comment">//skip this class</span></div>
<div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160; </div>
<div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;      <span class="comment">//rotate dir to center as needed</span></div>
<div class="line"><a name="l00824"></a><span class="lineno">  824</span>&#160;      Eigen::Vector3f direction (</div>
<div class="line"><a name="l00825"></a><span class="lineno">  825</span>&#160;        model-&gt;directions_to_center_(index, 0),</div>
<div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;        model-&gt;directions_to_center_(index, 1),</div>
<div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;        model-&gt;directions_to_center_(index, 2));</div>
<div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;      <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a1ba2c5aed4e6ca83a4c43e51c0f8b915">applyTransform</a> (direction, transform.transpose ());</div>
<div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160; </div>
<div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;      <a class="code" href="structpcl_1_1_interest_point.html">pcl::InterestPoint</a> vote;</div>
<div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;      Eigen::Vector3f vote_pos = sampled_point_cloud-&gt;points[i_point].getVector3fMap () + direction;</div>
<div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;      vote.x = vote_pos[0];</div>
<div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;      vote.y = vote_pos[1];</div>
<div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;      vote.z = vote_pos[2];</div>
<div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;      <span class="keywordtype">float</span> statistical_weight = model-&gt;statistical_weights_[in_class_of_interest][min_dist_idx];</div>
<div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;      <span class="keywordtype">float</span> learned_weight = model-&gt;learned_weights_[index];</div>
<div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;      <span class="keywordtype">float</span> power = statistical_weight * learned_weight;</div>
<div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;      vote.strength = power;</div>
<div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;      <span class="keywordflow">if</span> (vote.strength &gt; std::numeric_limits&lt;float&gt;::epsilon ())</div>
<div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;        out_votes-&gt;addVote (vote, sampled_point_cloud-&gt;points[i_point], i_class);</div>
<div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;    }</div>
<div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;  }<span class="comment">//next point</span></div>
<div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160; </div>
<div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;  <span class="keywordflow">return</span> (out_votes);</div>
<div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;}</div>
<div class="ttc" id="aclasspcl_1_1features_1_1_i_s_m_vote_list_html"><div class="ttname"><a href="classpcl_1_1features_1_1_i_s_m_vote_list.html">pcl::features::ISMVoteList</a></div><div class="ttdoc">This class is used for storing, analyzing and manipulating votes obtained from ISM algorithm.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.h:78</div></div>
<div class="ttc" id="astructpcl_1_1_interest_point_html"><div class="ttname"><a href="structpcl_1_1_interest_point.html">pcl::InterestPoint</a></div><div class="ttdoc">A point structure representing an interest point with Euclidean xyz coordinates, and an interest valu...</div><div class="ttdef"><b>Definition:</b> point_types.hpp:745</div></div>
</div><!-- fragment -->
</div>
</div>
<a id="a6a0f8e46d933e4b93b320a2c9682db84"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6a0f8e46d933e4b93b320a2c9682db84">&#9670;&nbsp;</a></span>generateCentersPP()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::generateCentersPP </td>
          <td>(</td>
          <td class="paramtype">const Eigen::MatrixXf &amp;&#160;</td>
          <td class="paramname"><em>data</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">Eigen::MatrixXf &amp;&#160;</td>
          <td class="paramname"><em>out_centers</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>number_of_clusters</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>trials</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">protected</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Generates centers for clusters as described in Arthur, David and Sergei Vassilvitski (2007) k-means++: The Advantages of Careful Seeding. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">data</td><td>points to cluster </td></tr>
    <tr><td class="paramdir">[out]</td><td class="paramname">out_centers</td><td>it will contain generated centers </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">number_of_clusters</td><td>defines the number of desired cluster centers </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">trials</td><td>number of trials to generate a center </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160;{</div>
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160;  <span class="keywordtype">size_t</span> dimension = data.cols ();</div>
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160;  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> number_of_points = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span> (data.rows ());</div>
<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>&#160;  std::vector&lt;int&gt; centers_vec (number_of_clusters);</div>
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160;  <span class="keywordtype">int</span>* centers = &amp;centers_vec[0];</div>
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160;  std::vector&lt;double&gt; dist (number_of_points);</div>
<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160;  std::vector&lt;double&gt; tdist (number_of_points);</div>
<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160;  std::vector&lt;double&gt; tdist2 (number_of_points);</div>
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160;  <span class="keywordtype">double</span> sum0 = 0.0;</div>
<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160; </div>
<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160;  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> random_unsigned = rand ();</div>
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160;  centers[0] = random_unsigned % number_of_points;</div>
<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160; </div>
<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_point = 0; i_point &lt; number_of_points; i_point++)</div>
<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160;  {</div>
<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160;    Eigen::VectorXf first (dimension);</div>
<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160;    Eigen::VectorXf second (dimension);</div>
<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160;    first = data.row (i_point);</div>
<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160;    second = data.row (centers[0]);</div>
<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160;    dist[i_point] = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a4f7f33ad9a8cec7886f8746b45165095">computeDistance</a> (first, second);</div>
<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160;    sum0 += dist[i_point];</div>
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160;  }</div>
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160; </div>
<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_cluster = 0; i_cluster &lt; number_of_clusters; i_cluster++)</div>
<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160;  {</div>
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;    <span class="keywordtype">double</span> best_sum = std::numeric_limits&lt;double&gt;::max ();</div>
<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160;    <span class="keywordtype">int</span> best_center = -1;</div>
<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_trials = 0; i_trials &lt; trials; i_trials++)</div>
<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160;    {</div>
<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160;      <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> random_integer = rand () - 1;</div>
<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160;      <span class="keywordtype">double</span> random_double = <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span> (random_integer) / <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span> (std::numeric_limits&lt;unsigned int&gt;::max ());</div>
<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160;      <span class="keywordtype">double</span> p = random_double * sum0;</div>
<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160; </div>
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160;      <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_point;</div>
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;      <span class="keywordflow">for</span> (i_point = 0; i_point &lt; number_of_points - 1; i_point++)</div>
<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;        <span class="keywordflow">if</span> ( (p -= dist[i_point]) &lt;= 0.0)</div>
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160;          <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160; </div>
<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160;      <span class="keywordtype">int</span> ci = i_point;</div>
<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160; </div>
<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160;      <span class="keywordtype">double</span> s = 0.0;</div>
<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160;      <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_point = 0; i_point &lt; number_of_points; i_point++)</div>
<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160;      {</div>
<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160;        Eigen::VectorXf first (dimension);</div>
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160;        Eigen::VectorXf second (dimension);</div>
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;        first = data.row (i_point);</div>
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;        second = data.row (ci);</div>
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;        tdist2[i_point] = std::min (<span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span> (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a4f7f33ad9a8cec7886f8746b45165095">computeDistance</a> (first, second)), dist[i_point]);</div>
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;        s += tdist2[i_point];</div>
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;      }</div>
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160; </div>
<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160;      <span class="keywordflow">if</span> (s &lt;= best_sum)</div>
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;      {</div>
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160;        best_sum = s;</div>
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;        best_center = ci;</div>
<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;        std::swap (tdist, tdist2);</div>
<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160;      }</div>
<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160;    }</div>
<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160; </div>
<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;    centers[i_cluster] = best_center;</div>
<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;    sum0 = best_sum;</div>
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;    std::swap (dist, tdist);</div>
<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160;  }</div>
<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160; </div>
<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i_cluster = 0; i_cluster &lt; number_of_clusters; i_cluster++)</div>
<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_dim = 0; i_dim &lt; dimension; i_dim++)</div>
<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160;      out_centers (i_cluster, i_dim) = data (centers[i_cluster], i_dim);</div>
<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160;}</div>
</div><!-- fragment -->
</div>
</div>
<a id="a33688b88157c6d8b15290ed88646effb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a33688b88157c6d8b15290ed88646effb">&#9670;&nbsp;</a></span>generateRandomCenter()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::generateRandomCenter </td>
          <td>(</td>
          <td class="paramtype">const std::vector&lt; Eigen::Vector2f, Eigen::aligned_allocator&lt; Eigen::Vector2f &gt; &gt; &amp;&#160;</td>
          <td class="paramname"><em>boxes</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">Eigen::VectorXf &amp;&#160;</td>
          <td class="paramname"><em>center</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">protected</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Generates random center for cluster. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">boxes</td><td>contains min and max values for each dimension </td></tr>
    <tr><td class="paramdir">[out]</td><td class="paramname">center</td><td>it will the contain generated center </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160;{</div>
<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>&#160;  <span class="keywordtype">size_t</span> dimension = boxes.size ();</div>
<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160;  <span class="keywordtype">float</span> margin = 1.0f / <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (dimension);</div>
<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160; </div>
<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i_dim = 0; i_dim &lt; dimension; i_dim++)</div>
<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160;  {</div>
<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> random_integer = rand () - 1;</div>
<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160;    <span class="keywordtype">float</span> random_float = <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (random_integer) / <span class="keyword">static_cast&lt;</span><span class="keywordtype">float</span><span class="keyword">&gt;</span> (std::numeric_limits&lt;unsigned int&gt;::max ());</div>
<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160;    center (i_dim) = (random_float * (1.0f + margin * 2.0f)- margin) * (boxes[i_dim] (1) - boxes[i_dim] (0)) + boxes[i_dim] (0);</div>
<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;  }</div>
<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160;}</div>
</div><!-- fragment -->
</div>
</div>
<a id="aaf734e2f3120bb043404596956f01f6c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aaf734e2f3120bb043404596956f01f6c">&#9670;&nbsp;</a></span>setFeatureEstimator()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::setFeatureEstimator </td>
          <td>(</td>
          <td class="paramtype">boost::shared_ptr&lt; <a class="el" href="classpcl_1_1_feature.html">pcl::Feature</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_histogram.html">pcl::Histogram</a>&lt; FeatureSize &gt; &gt; &gt;&#160;</td>
          <td class="paramname"><em>feature</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Changes the feature estimator. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">feature</td><td>feature estimator that will be used to extract the descriptors. Note that it must be fully initialized and configured. </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;{</div>
<div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a59c6f181873500f38df1d7eab07a67cb">feature_estimator_</a> = feature;</div>
<div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;}</div>
</div><!-- fragment -->
</div>
</div>
<a id="ac0b8072d7f6048c714854202bf00790a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac0b8072d7f6048c714854202bf00790a">&#9670;&nbsp;</a></span>setNumberOfClusters()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::setNumberOfClusters </td>
          <td>(</td>
          <td class="paramtype">unsigned int&#160;</td>
          <td class="paramname"><em>num_of_clusters</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Changes the number of clusters. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramname">num_of_clusters</td><td>desired number of clusters </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;{</div>
<div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;  <span class="keywordflow">if</span> (num_of_clusters &gt; 0)</div>
<div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;    <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab74fef9c7fed6a762448dd89f9210e12">number_of_clusters_</a> = num_of_clusters;</div>
<div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;}</div>
</div><!-- fragment -->
</div>
</div>
<a id="a4a5c99e74ddf4ae9bc3caa3575b6ca11"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4a5c99e74ddf4ae9bc3caa3575b6ca11">&#9670;&nbsp;</a></span>setNVotState()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::setNVotState </td>
          <td>(</td>
          <td class="paramtype">bool&#160;</td>
          <td class="paramname"><em>state</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Changes the state of the Nvot coeff from [Knopp et al., 2010, (4)]. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">state</td><td>desired state, if false then Nvot is taken as 1.0 </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;{</div>
<div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aaf6529639183fac2a343afad1329c389">n_vot_ON_</a> = state;</div>
<div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;}</div>
</div><!-- fragment -->
</div>
</div>
<a id="ae01b18529098566b7244f16ccf864cf1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae01b18529098566b7244f16ccf864cf1">&#9670;&nbsp;</a></span>setSamplingSize()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::setSamplingSize </td>
          <td>(</td>
          <td class="paramtype">float&#160;</td>
          <td class="paramname"><em>sampling_size</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Changes the sampling size used for cloud simplification. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">sampling_size</td><td>desired size of grid bin </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;{</div>
<div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;  <span class="keywordflow">if</span> (sampling_size &gt;= std::numeric_limits&lt;float&gt;::epsilon ())</div>
<div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;    <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#adf847cb3c880ca5d2dc5f71d60a0d725">sampling_size_</a> = sampling_size;</div>
<div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;}</div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_adf847cb3c880ca5d2dc5f71d60a0d725"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#adf847cb3c880ca5d2dc5f71d60a0d725">pcl::ism::ImplicitShapeModelEstimation::sampling_size_</a></div><div class="ttdeci">float sampling_size_</div><div class="ttdoc">This value is used for the simplification. It sets the size of grid bin.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.h:598</div></div>
</div><!-- fragment -->
</div>
</div>
<a id="af8eb194807519f620f01decec6dcd8a7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af8eb194807519f620f01decec6dcd8a7">&#9670;&nbsp;</a></span>setSigmaDists()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::setSigmaDists </td>
          <td>(</td>
          <td class="paramtype">const std::vector&lt; float &gt; &amp;&#160;</td>
          <td class="paramname"><em>training_sigmas</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>This method allows to set the value of sigma used for calculating the learned weights for every single class. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">training_sigmas</td><td>new sigmas for every class. If you want these values to be computed automatically, just pass the empty array. The automatic regime calculates the maximum distance between the objects points and takes 10% of this value as recomended in the article. If there are several objects of the same class, then it computes the average maximum distance and takes 10%. Note that each class has its own sigma value. </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;{</div>
<div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae02a68f40df9efa2b38bb4acc6b58f20">training_sigmas_</a>.clear ();</div>
<div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;  std::vector&lt;float&gt; sigmas ( training_sigmas.begin (), training_sigmas.end () );</div>
<div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae02a68f40df9efa2b38bb4acc6b58f20">training_sigmas_</a>.swap (sigmas);</div>
<div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;}</div>
</div><!-- fragment -->
</div>
</div>
<a id="afa36d00337ee0a1adfc2b566fc46e9d7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afa36d00337ee0a1adfc2b566fc46e9d7">&#9670;&nbsp;</a></span>setTrainingClasses()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::setTrainingClasses </td>
          <td>(</td>
          <td class="paramtype">const std::vector&lt; unsigned int &gt; &amp;&#160;</td>
          <td class="paramname"><em>training_classes</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Allows to set the class labels for the corresponding training clouds. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">training_classes</td><td>array of class labels </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;{</div>
<div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>.clear ();</div>
<div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;  std::vector&lt;unsigned int&gt; classes ( training_classes.begin (), training_classes.end () );</div>
<div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>.swap (classes);</div>
<div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;}</div>
</div><!-- fragment -->
</div>
</div>
<a id="a43e42d336b600c4d6e7d8b9665d16c86"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a43e42d336b600c4d6e7d8b9665d16c86">&#9670;&nbsp;</a></span>setTrainingClouds()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::setTrainingClouds </td>
          <td>(</td>
          <td class="paramtype">const std::vector&lt; typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt;::Ptr &gt; &amp;&#160;</td>
          <td class="paramname"><em>training_clouds</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Allows to set clouds for training the ISM model. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">training_clouds</td><td>array of point clouds for training </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;{</div>
<div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>.clear ();</div>
<div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;  std::vector&lt;typename pcl::PointCloud&lt;PointT&gt;::Ptr &gt; clouds ( training_clouds.begin (), training_clouds.end () );</div>
<div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ae649a1601f3d60f929d41782e9733bea">training_clouds_</a>.swap (clouds);</div>
<div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;}</div>
</div><!-- fragment -->
</div>
</div>
<a id="a5c310cb89a7be4b388bea1526111a525"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5c310cb89a7be4b388bea1526111a525">&#9670;&nbsp;</a></span>setTrainingNormals()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::setTrainingNormals </td>
          <td>(</td>
          <td class="paramtype">const std::vector&lt; typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::Ptr &gt; &amp;&#160;</td>
          <td class="paramname"><em>training_normals</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Allows to set normals for the training clouds that were passed through setTrainingClouds method. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">training_normals</td><td>array of clouds, each cloud is the cloud of normals </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;{</div>
<div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a7145a95483ee85c15fb36bf0c34a4861">training_normals_</a>.clear ();</div>
<div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;  std::vector&lt;typename pcl::PointCloud&lt;NormalT&gt;::Ptr &gt; normals ( training_normals.begin (), training_normals.end () );</div>
<div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a7145a95483ee85c15fb36bf0c34a4861">training_normals_</a>.swap (normals);</div>
<div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;}</div>
</div><!-- fragment -->
</div>
</div>
<a id="a56c5bfb3d5801c417ae72bd8f2f80316"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a56c5bfb3d5801c417ae72bd8f2f80316">&#9670;&nbsp;</a></span>shiftCloud()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::shiftCloud </td>
          <td>(</td>
          <td class="paramtype">typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt;::Ptr&#160;</td>
          <td class="paramname"><em>in_cloud</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">Eigen::Vector3f&#160;</td>
          <td class="paramname"><em>shift_point</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">protected</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>This method simply shifts the clouds points relative to the passed point. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">in_cloud</td><td>cloud to shift </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">shift_point</td><td>point relative to which the cloud will be shifted </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;{</div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;  <span class="keyword">typename</span> pcl::PointCloud&lt;PointT&gt;::iterator point_it;</div>
<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;  <span class="keywordflow">for</span> (point_it = in_cloud-&gt;points.begin (); point_it != in_cloud-&gt;points.end (); point_it++)</div>
<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160;  {</div>
<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160;    point_it-&gt;x -= shift_point.x ();</div>
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;    point_it-&gt;y -= shift_point.y ();</div>
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160;    point_it-&gt;z -= shift_point.z ();</div>
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160;  }</div>
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160;}</div>
</div><!-- fragment -->
</div>
</div>
<a id="aeab8318ded750cbf52cd272daeeeba98"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aeab8318ded750cbf52cd272daeeeba98">&#9670;&nbsp;</a></span>simplifyCloud()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::simplifyCloud </td>
          <td>(</td>
          <td class="paramtype">typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt;::ConstPtr&#160;</td>
          <td class="paramname"><em>in_point_cloud</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::ConstPtr&#160;</td>
          <td class="paramname"><em>in_normal_cloud</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> &gt;::Ptr&#160;</td>
          <td class="paramname"><em>out_sampled_point_cloud</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">typename <a class="el" href="classpcl_1_1_point_cloud.html">pcl::PointCloud</a>&lt; <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::Ptr&#160;</td>
          <td class="paramname"><em>out_sampled_normal_cloud</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">protected</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Simplifies the cloud using voxel grid principles. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">in_point_cloud</td><td>cloud that need to be simplified </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">in_normal_cloud</td><td>normals of the cloud that need to be simplified </td></tr>
    <tr><td class="paramdir">[out]</td><td class="paramname">out_sampled_point_cloud</td><td>simplified cloud </td></tr>
    <tr><td class="paramdir">[out]</td><td class="paramname">out_sampled_normal_cloud</td><td>and the corresponding normals </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;{</div>
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;  <span class="comment">//create voxel grid</span></div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160;  <a class="code" href="classpcl_1_1_voxel_grid.html">pcl::VoxelGrid&lt;PointT&gt;</a> grid;</div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160;  grid.<a class="code" href="classpcl_1_1_voxel_grid.html#aa5d7831e665977bdce76ed05bd0005cf">setLeafSize</a> (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#adf847cb3c880ca5d2dc5f71d60a0d725">sampling_size_</a>, <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#adf847cb3c880ca5d2dc5f71d60a0d725">sampling_size_</a>, <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#adf847cb3c880ca5d2dc5f71d60a0d725">sampling_size_</a>);</div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;  grid.<a class="code" href="classpcl_1_1_voxel_grid.html#aabb07bacf03039f40d256b36ee2dd495">setSaveLeafLayout</a> (<span class="keyword">true</span>);</div>
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;  grid.<a class="code" href="classpcl_1_1_p_c_l_base.html#a1952d7101f3942bac3b69ed55c1ca7ea">setInputCloud</a> (in_point_cloud);</div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160; </div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160;  <a class="code" href="classpcl_1_1_point_cloud.html">pcl::PointCloud&lt;PointT&gt;</a> temp_cloud;</div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;  grid.<a class="code" href="classpcl_1_1_filter.html#a17115897ca28f6b12950d023958aa641">filter</a> (temp_cloud);</div>
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160; </div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160;  <span class="comment">//extract indices of points from source cloud which are closest to grid points</span></div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160;  <span class="keyword">const</span> <span class="keywordtype">float</span> max_value = std::numeric_limits&lt;float&gt;::max ();</div>
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160; </div>
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;  <span class="keyword">const</span> <span class="keywordtype">size_t</span> num_source_points = in_point_cloud-&gt;points.size ();</div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;  <span class="keyword">const</span> <span class="keywordtype">size_t</span> num_sample_points = temp_cloud.<a class="code" href="classpcl_1_1_point_cloud.html#af16a62638198313b9c093127c492c884">points</a>.size ();</div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160; </div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160;  std::vector&lt;float&gt; dist_to_grid_center (num_sample_points, max_value);</div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160;  std::vector&lt;int&gt; sampling_indices (num_sample_points, -1);</div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160; </div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i_point = 0; i_point &lt; num_source_points; i_point++)</div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;  {</div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;    <span class="keywordtype">int</span> index = grid.<a class="code" href="classpcl_1_1_voxel_grid.html#a0b7ead02de1bfcce1100ff66cbc12998">getCentroidIndex</a> (in_point_cloud-&gt;points[i_point]);</div>
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;    <span class="keywordflow">if</span> (index == -1)</div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160; </div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160;    <a class="code" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> pt_1 = in_point_cloud-&gt;points[i_point];</div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160;    <a class="code" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a> pt_2 = temp_cloud.<a class="code" href="classpcl_1_1_point_cloud.html#af16a62638198313b9c093127c492c884">points</a>[index];</div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160; </div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;    <span class="keywordtype">float</span> <a class="code" href="common_2include_2pcl_2common_2geometry_8h.html#a2fc89f0c26b7c7377fcd2851fa933b87">distance</a> = (pt_1.x - pt_2.x) * (pt_1.x - pt_2.x) + (pt_1.y - pt_2.y) * (pt_1.y - pt_2.y) + (pt_1.z - pt_2.z) * (pt_1.z - pt_2.z);</div>
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;    <span class="keywordflow">if</span> (distance &lt; dist_to_grid_center[index])</div>
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;    {</div>
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160;      dist_to_grid_center[index] = <a class="code" href="common_2include_2pcl_2common_2geometry_8h.html#a2fc89f0c26b7c7377fcd2851fa933b87">distance</a>;</div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;      sampling_indices[index] = <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span> (i_point);</div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160;    }</div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;  }</div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160; </div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160;  <span class="comment">//extract source points</span></div>
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;  pcl::PointIndices::Ptr final_inliers_indices (<span class="keyword">new</span> <a class="code" href="structpcl_1_1_point_indices.html">pcl::PointIndices</a> ());</div>
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160;  <a class="code" href="classpcl_1_1_extract_indices.html">pcl::ExtractIndices&lt;PointT&gt;</a> extract_points;</div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;  <a class="code" href="classpcl_1_1_extract_indices.html">pcl::ExtractIndices&lt;NormalT&gt;</a> extract_normals;</div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160; </div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160;  final_inliers_indices-&gt;indices.reserve (num_sample_points);</div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i_point = 0; i_point &lt; num_sample_points; i_point++)</div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;  {</div>
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160;    <span class="keywordflow">if</span> (sampling_indices[i_point] != -1)</div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;      final_inliers_indices-&gt;indices.push_back ( sampling_indices[i_point] );</div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;  }</div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160; </div>
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160;  extract_points.<a class="code" href="classpcl_1_1_p_c_l_base.html#a1952d7101f3942bac3b69ed55c1ca7ea">setInputCloud</a> (in_point_cloud);</div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;  extract_points.<a class="code" href="classpcl_1_1_p_c_l_base.html#ab219359de6eb34c9d51e2e976dd1a0d1">setIndices</a> (final_inliers_indices);</div>
<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160;  extract_points.filter (*out_sampled_point_cloud);</div>
<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160; </div>
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;  extract_normals.<a class="code" href="classpcl_1_1_p_c_l_base.html#a1952d7101f3942bac3b69ed55c1ca7ea">setInputCloud</a> (in_normal_cloud);</div>
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160;  extract_normals.<a class="code" href="classpcl_1_1_p_c_l_base.html#ab219359de6eb34c9d51e2e976dd1a0d1">setIndices</a> (final_inliers_indices);</div>
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160;  extract_normals.filter (*out_sampled_normal_cloud);</div>
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;}</div>
<div class="ttc" id="aclasspcl_1_1_extract_indices_html"><div class="ttname"><a href="classpcl_1_1_extract_indices.html">pcl::ExtractIndices</a></div><div class="ttdoc">ExtractIndices extracts a set of indices from a point cloud.</div><div class="ttdef"><b>Definition:</b> extract_indices.h:71</div></div>
<div class="ttc" id="aclasspcl_1_1_filter_html_a17115897ca28f6b12950d023958aa641"><div class="ttname"><a href="classpcl_1_1_filter.html#a17115897ca28f6b12950d023958aa641">pcl::Filter::filter</a></div><div class="ttdeci">void filter(PointCloud &amp;output)</div><div class="ttdoc">Calls the filtering method and returns the filtered dataset in output.</div><div class="ttdef"><b>Definition:</b> filter.h:132</div></div>
<div class="ttc" id="aclasspcl_1_1_p_c_l_base_html_a1952d7101f3942bac3b69ed55c1ca7ea"><div class="ttname"><a href="classpcl_1_1_p_c_l_base.html#a1952d7101f3942bac3b69ed55c1ca7ea">pcl::PCLBase::setInputCloud</a></div><div class="ttdeci">virtual void setInputCloud(const PointCloudConstPtr &amp;cloud)</div><div class="ttdoc">Provide a pointer to the input dataset</div><div class="ttdef"><b>Definition:</b> pcl_base.hpp:66</div></div>
<div class="ttc" id="aclasspcl_1_1_p_c_l_base_html_ab219359de6eb34c9d51e2e976dd1a0d1"><div class="ttname"><a href="classpcl_1_1_p_c_l_base.html#ab219359de6eb34c9d51e2e976dd1a0d1">pcl::PCLBase::setIndices</a></div><div class="ttdeci">virtual void setIndices(const IndicesPtr &amp;indices)</div><div class="ttdoc">Provide a pointer to the vector of indices that represents the input data.</div><div class="ttdef"><b>Definition:</b> pcl_base.hpp:73</div></div>
<div class="ttc" id="aclasspcl_1_1_point_cloud_html_af16a62638198313b9c093127c492c884"><div class="ttname"><a href="classpcl_1_1_point_cloud.html#af16a62638198313b9c093127c492c884">pcl::PointCloud::points</a></div><div class="ttdeci">std::vector&lt; PointT, Eigen::aligned_allocator&lt; PointT &gt; &gt; points</div><div class="ttdoc">The point data.</div><div class="ttdef"><b>Definition:</b> point_cloud.h:410</div></div>
<div class="ttc" id="aclasspcl_1_1_voxel_grid_html"><div class="ttname"><a href="classpcl_1_1_voxel_grid.html">pcl::VoxelGrid</a></div><div class="ttdoc">VoxelGrid assembles a local 3D grid over a given PointCloud, and downsamples + filters the data.</div><div class="ttdef"><b>Definition:</b> voxel_grid.h:179</div></div>
<div class="ttc" id="aclasspcl_1_1_voxel_grid_html_a0b7ead02de1bfcce1100ff66cbc12998"><div class="ttname"><a href="classpcl_1_1_voxel_grid.html#a0b7ead02de1bfcce1100ff66cbc12998">pcl::VoxelGrid::getCentroidIndex</a></div><div class="ttdeci">int getCentroidIndex(const PointT &amp;p)</div><div class="ttdoc">Returns the index in the resulting downsampled cloud of the specified point.</div><div class="ttdef"><b>Definition:</b> voxel_grid.h:319</div></div>
<div class="ttc" id="aclasspcl_1_1_voxel_grid_html_aa5d7831e665977bdce76ed05bd0005cf"><div class="ttname"><a href="classpcl_1_1_voxel_grid.html#aa5d7831e665977bdce76ed05bd0005cf">pcl::VoxelGrid::setLeafSize</a></div><div class="ttdeci">void setLeafSize(const Eigen::Vector4f &amp;leaf_size)</div><div class="ttdoc">Set the voxel grid leaf size.</div><div class="ttdef"><b>Definition:</b> voxel_grid.h:223</div></div>
<div class="ttc" id="aclasspcl_1_1_voxel_grid_html_aabb07bacf03039f40d256b36ee2dd495"><div class="ttname"><a href="classpcl_1_1_voxel_grid.html#aabb07bacf03039f40d256b36ee2dd495">pcl::VoxelGrid::setSaveLeafLayout</a></div><div class="ttdeci">void setSaveLeafLayout(bool save_leaf_layout)</div><div class="ttdoc">Set to true if leaf layout information needs to be saved for later access.</div><div class="ttdef"><b>Definition:</b> voxel_grid.h:280</div></div>
<div class="ttc" id="astructpcl_1_1_point_indices_html"><div class="ttname"><a href="structpcl_1_1_point_indices.html">pcl::PointIndices</a></div><div class="ttdef"><b>Definition:</b> PointIndices.h:13</div></div>
</div><!-- fragment -->
</div>
</div>
<a id="a0df7cc562e4e36d408c2738e67d1191f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0df7cc562e4e36d408c2738e67d1191f">&#9670;&nbsp;</a></span>trainISM()</h2>

<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;int FeatureSize, typename PointT , typename NormalT &gt; </div>
      <table class="memname">
        <tr>
          <td class="memname">bool <a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">pcl::ism::ImplicitShapeModelEstimation</a>&lt; FeatureSize, <a class="el" href="structpcl_1_1_point_x_y_z_r_g_b_a.html">PointT</a>, <a class="el" href="structpcl_1_1_normal.html">NormalT</a> &gt;::trainISM </td>
          <td>(</td>
          <td class="paramtype">ISMModelPtr &amp;&#160;</td>
          <td class="paramname"><em>trained_model</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>This method performs training and forms a visual vocabulary. It returns a trained model that can be saved to file for later usage. </p>
<dl class="params"><dt>参数</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[out]</td><td class="paramname">trained_model</td><td>trained model </td></tr>
  </table>
  </dd>
</dl>
<div class="fragment"><div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;{</div>
<div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;  <span class="keywordtype">bool</span> success = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160; </div>
<div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;  <span class="keywordflow">if</span> (trained_model == 0)</div>
<div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;    <span class="keywordflow">return</span> (<span class="keyword">false</span>);</div>
<div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;  trained_model-&gt;reset ();</div>
<div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160; </div>
<div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;  std::vector&lt;pcl::Histogram&lt;FeatureSize&gt; &gt; histograms;</div>
<div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;  std::vector&lt;LocationInfo, Eigen::aligned_allocator&lt;LocationInfo&gt; &gt; locations;</div>
<div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;  success = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aada2c42e9685032c4cd2beb2a29b157c">extractDescriptors</a> (histograms, locations);</div>
<div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;  <span class="keywordflow">if</span> (!success)</div>
<div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;    <span class="keywordflow">return</span> (<span class="keyword">false</span>);</div>
<div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160; </div>
<div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;  Eigen::MatrixXi labels;</div>
<div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;  success = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#accdd4bb97e49ade2295cd49f59e78eba">clusterDescriptors</a>(histograms, labels, trained_model-&gt;clusters_centers_);</div>
<div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;  <span class="keywordflow">if</span> (!success)</div>
<div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;    <span class="keywordflow">return</span> (<span class="keyword">false</span>);</div>
<div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160; </div>
<div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;  std::vector&lt;unsigned int&gt; vec;</div>
<div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;  trained_model-&gt;clusters_.resize (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab74fef9c7fed6a762448dd89f9210e12">number_of_clusters_</a>, vec);</div>
<div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i_label = 0; i_label &lt; locations.size (); i_label++)</div>
<div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;    trained_model-&gt;clusters_[labels (i_label)].push_back (i_label);</div>
<div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160; </div>
<div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab5390e2ac51390339be681e644a1bdc9">calculateSigmas</a> (trained_model-&gt;sigmas_);</div>
<div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160; </div>
<div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;  <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a833845333ec925a77af5b963953ee37d">calculateWeights</a>(</div>
<div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;    locations,</div>
<div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;    labels,</div>
<div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;    trained_model-&gt;sigmas_,</div>
<div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;    trained_model-&gt;clusters_,</div>
<div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;    trained_model-&gt;statistical_weights_,</div>
<div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;    trained_model-&gt;learned_weights_);</div>
<div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160; </div>
<div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;  trained_model-&gt;number_of_classes_ = *std::max_element (<a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>.begin (), <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>.end () ) + 1;</div>
<div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;  trained_model-&gt;number_of_visual_words_ = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span> (histograms.size ());</div>
<div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;  trained_model-&gt;number_of_clusters_ = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#ab74fef9c7fed6a762448dd89f9210e12">number_of_clusters_</a>;</div>
<div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;  trained_model-&gt;descriptors_dimension_ = FeatureSize;</div>
<div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160; </div>
<div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;  trained_model-&gt;directions_to_center_.resize (locations.size (), 3);</div>
<div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;  trained_model-&gt;classes_.resize (locations.size ());</div>
<div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i_dir = 0; i_dir &lt; locations.size (); i_dir++)</div>
<div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;  {</div>
<div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;    trained_model-&gt;directions_to_center_(i_dir, 0) = locations[i_dir].dir_to_center_.x;</div>
<div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;    trained_model-&gt;directions_to_center_(i_dir, 1) = locations[i_dir].dir_to_center_.y;</div>
<div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;    trained_model-&gt;directions_to_center_(i_dir, 2) = locations[i_dir].dir_to_center_.z;</div>
<div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;    trained_model-&gt;classes_[i_dir] = <a class="code" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a5bea2020d8fbe1a7a824eb57eed5a31e">training_classes_</a>[locations[i_dir].model_num_];</div>
<div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;  }</div>
<div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160; </div>
<div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;  <span class="keywordflow">return</span> (<span class="keyword">true</span>);</div>
<div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;}</div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_a833845333ec925a77af5b963953ee37d"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#a833845333ec925a77af5b963953ee37d">pcl::ism::ImplicitShapeModelEstimation::calculateWeights</a></div><div class="ttdeci">void calculateWeights(const std::vector&lt; LocationInfo, Eigen::aligned_allocator&lt; LocationInfo &gt; &gt; &amp;locations, const Eigen::MatrixXi &amp;labels, std::vector&lt; float &gt; &amp;sigmas, std::vector&lt; std::vector&lt; unsigned int &gt; &gt; &amp;clusters, std::vector&lt; std::vector&lt; float &gt; &gt; &amp;statistical_weights, std::vector&lt; float &gt; &amp;learned_weights)</div><div class="ttdoc">This function forms a visual vocabulary and evaluates weights described in [Knopp et al....</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.hpp:993</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_aada2c42e9685032c4cd2beb2a29b157c"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#aada2c42e9685032c4cd2beb2a29b157c">pcl::ism::ImplicitShapeModelEstimation::extractDescriptors</a></div><div class="ttdeci">bool extractDescriptors(std::vector&lt; pcl::Histogram&lt; FeatureSize &gt; &gt; &amp;histograms, std::vector&lt; LocationInfo, Eigen::aligned_allocator&lt; LocationInfo &gt; &gt; &amp;locations)</div><div class="ttdoc">Extracts the descriptors from the input clouds.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.hpp:849</div></div>
<div class="ttc" id="aclasspcl_1_1ism_1_1_implicit_shape_model_estimation_html_accdd4bb97e49ade2295cd49f59e78eba"><div class="ttname"><a href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html#accdd4bb97e49ade2295cd49f59e78eba">pcl::ism::ImplicitShapeModelEstimation::clusterDescriptors</a></div><div class="ttdeci">bool clusterDescriptors(std::vector&lt; pcl::Histogram&lt; FeatureSize &gt; &gt; &amp;histograms, Eigen::MatrixXi &amp;labels, Eigen::MatrixXf &amp;clusters_centers)</div><div class="ttdoc">This method performs descriptor clustering.</div><div class="ttdef"><b>Definition:</b> implicit_shape_model.hpp:916</div></div>
</div><!-- fragment -->
</div>
</div>
<hr/>该类的文档由以下文件生成:<ul>
<li>recognition/include/pcl/recognition/<a class="el" href="implicit__shape__model_8h_source.html">implicit_shape_model.h</a></li>
<li>recognition/include/pcl/recognition/impl/<a class="el" href="implicit__shape__model_8hpp_source.html">implicit_shape_model.hpp</a></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><b>pcl</b></li><li class="navelem"><b>ism</b></li><li class="navelem"><a class="el" href="classpcl_1_1ism_1_1_implicit_shape_model_estimation.html">ImplicitShapeModelEstimation</a></li>
    <li class="footer">制作者 <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </li>
  </ul>
</div>
</body>
</html>
